Compare commits

...

483 commits

Author SHA1 Message Date
HJ
cf7fab7103 Merge branch 'fix-mute-reasons-whitespaces' into 'develop'
Fix whitespaces for multiple status mute reasons, display bot status reason

See merge request pleroma/pleroma-fe!1948
2024-10-07 11:23:30 +00:00
Alexander Tumin
bbef4e40df Fix whitespaces for multiple status mute reasons, display bot status reason 2024-10-07 13:39:41 +03:00
HJ
bb0a7a81c5 Merge branch 'bookmark-folders' into 'develop'
Bookmark folders

Closes #1335

See merge request pleroma/pleroma-fe!1945
2024-10-04 10:11:49 +00:00
marcin mikołajczak
216ca52073 Merge remote-tracking branch 'origin/develop' into bookmark-folders
Signed-off-by: marcin mikołajczak <git@mkljczk.pl>
2024-10-03 21:52:44 +02:00
HJ
a1c3a7a742 Merge branch 'shadow-control-2.0' into 'develop'
Fixed and refined the shadow control in theme tab

See merge request pleroma/pleroma-fe!1939
2024-10-03 19:44:24 +00:00
HJ
56a3bff267 Merge branch 'splashscreen' into 'develop'
Splash screen

See merge request pleroma/pleroma-fe!1940
2024-10-03 19:44:12 +00:00
Henry Jameson
05ab57a8e6 better disabled indication 2024-09-29 19:23:32 +03:00
Henry Jameson
c677bbf102 fallback 2024-09-29 19:20:58 +03:00
Henry Jameson
c2dfe62481 subshadow select event + better styles for preview 2024-09-29 19:20:09 +03:00
Henry Jameson
dd4cab74d1 small fixes 2024-09-29 00:57:00 +03:00
Henry Jameson
0cec6dc356 better small shadow-tweak styles 2024-09-28 20:33:30 +03:00
Henry Jameson
d234ad8672 properly support "disabled" state of contoller 2024-09-28 20:27:55 +03:00
marcin mikołajczak
a5689464d0 Add 'all bookmarks' link to bookmark folders list
Signed-off-by: marcin mikołajczak <git@mkljczk.pl>
2024-09-26 09:54:02 +02:00
marcin mikołajczak
44a7f8a485 Styles improvements
Signed-off-by: marcin mikołajczak <git@mkljczk.pl>
2024-09-26 08:26:35 +02:00
marcin mikołajczak
9f0fc431dc Allow to change bookmark folder emoji
Signed-off-by: marcin mikołajczak <git@mkljczk.pl>
2024-09-26 02:02:23 +02:00
Henry Jameson
51a8b20a92 changelog 2024-09-26 01:46:17 +03:00
marcin mikołajczak
2b6de423d5 Bookmark folder editing
Signed-off-by: marcin mikołajczak <git@mkljczk.pl>
2024-09-26 00:40:06 +02:00
Henry Jameson
6fc929a0a0 Merge remote-tracking branch 'origin/develop' into shadow-control-2.0 2024-09-26 01:10:57 +03:00
Henry Jameson
22cc96705a no preview support for shadow control (for themes 3 editor) 2024-09-25 17:56:34 +03:00
Henry Jameson
9370ee8c17 fix lightGrid not working, add more stuff for style editor 2024-09-25 00:47:54 +03:00
Henry Jameson
d2a9653ecb forgot something again 2024-09-24 19:32:08 +03:00
Henry Jameson
735433beb4 separate shadow preview into its own component, needed for themes3 editor 2024-09-24 19:19:53 +03:00
HJ
05c0b16a93 Merge branch 'weblate' into 'develop'
Translations update from Pleroma Weblate

See merge request pleroma/pleroma-fe!1936
2024-09-24 00:06:10 +00:00
marcin mikołajczak
49ec95b8f6 Add icon for folder selector
Signed-off-by: marcin mikołajczak <git@mkljczk.pl>
2024-09-24 00:44:51 +02:00
marcin mikołajczak
1097b95fa5 Merge remote-tracking branch 'origin/develop' into bookmark-folders 2024-09-24 00:38:55 +02:00
marcin mikołajczak
6c7a263371 Fix fetching more bookmarks
Signed-off-by: marcin mikołajczak <git@mkljczk.pl>
2024-09-24 00:11:35 +02:00
marcin mikołajczak
796372adf3 Remove unused import
Signed-off-by: marcin mikołajczak <git@mkljczk.pl>
2024-09-24 00:07:54 +02:00
marcin mikołajczak
4930aabe79 Add changelog entry for bookmark folders
Signed-off-by: marcin mikołajczak <git@mkljczk.pl>
2024-09-24 00:05:57 +02:00
marcin mikołajczak
89fbaa159f Allow adding bookmarks to folders
Signed-off-by: marcin mikołajczak <git@mkljczk.pl>
2024-09-24 00:05:33 +02:00
Kian-ting Tan
6335a205c8 Translated using Weblate (Chinese (Min Nan) (nan_TW))
Currently translated at 91.6% (1093 of 1193 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/nan_TW/
2024-09-23 21:33:26 +00:00
HJ
cf24e30095 Merge branch 'fix-shadows-everywhere' into 'develop'
add 'none' keyword to PISS shadow definiton that equals empty array

See merge request pleroma/pleroma-fe!1946
2024-09-23 21:33:19 +00:00
Henry Jameson
7a7ed917b3 """changelog""" 2024-09-24 00:26:05 +03:00
Henry Jameson
ab8907909b add 'none' keyword to PISS shadow definiton that equals empty array 2024-09-24 00:23:25 +03:00
marcin mikołajczak
9e45228823 Bookmark folders
Signed-off-by: marcin mikołajczak <git@mkljczk.pl>
2024-09-23 23:13:40 +02:00
HJ
a8092de638 Merge branch 'gallery-specs' into 'develop'
Gallery specs

See merge request pleroma/pleroma-fe!1944
2024-09-21 09:01:59 +00:00
Henry Jameson
32d82f10d9 remove .only 2024-09-21 11:56:34 +03:00
HJ
ab91778895 Merge branch 'renovate/karma-firefox-launcher-2.x' into 'develop'
Update dependency karma-firefox-launcher to v2.1.3

See merge request pleroma/pleroma-fe!1902
2024-09-21 08:48:11 +00:00
HJ
b420521e5a Merge branch 'renovate/vue-babel-plugin-jsx-1.x' into 'develop'
Update dependency @vue/babel-plugin-jsx to v1.2.2

See merge request pleroma/pleroma-fe!1896
2024-09-21 08:41:29 +00:00
HJ
cc98c74ff4 Merge branch 'renovate/karma-6.x' into 'develop'
Update dependency karma to v6.4.3

See merge request pleroma/pleroma-fe!1900
2024-09-21 08:22:48 +00:00
HJ
e84c7e87b9 Merge branch 'renovate/ruffle-rs-ruffle-0.x' into 'develop'
Update dependency @ruffle-rs/ruffle to v0.1.0-nightly.2024.5.20

See merge request pleroma/pleroma-fe!1894
2024-09-21 08:21:55 +00:00
HJ
9e65b17644 Merge branch 'non-anonymous-polls' into 'develop'
Inform users that Smithereen public polls are public

See merge request pleroma/pleroma-fe!1932
2024-09-21 08:19:16 +00:00
HJ
f127ae307b Merge branch 'piss-serialization' into 'develop'
Pleroma ISS (interface stylesheets) implementation

See merge request pleroma/pleroma-fe!1943
2024-09-21 08:18:23 +00:00
Henry Jameson
14328917f1 only 2024-09-20 14:25:36 +03:00
Henry Jameson
b5da1f8b89 fix lint 2024-09-20 12:54:47 +03:00
Henry Jameson
48f0a95a3b more tests, fixed some issues 2024-09-20 12:50:05 +03:00
Henry Jameson
bd514ab6d0 found the file lol 2024-09-20 11:21:26 +03:00
Henry Jameson
1124ace7f6 lack of changelog 2024-09-20 11:19:16 +03:00
Henry Jameson
dae206add3 remove 'only' 2024-09-20 02:07:46 +03:00
Henry Jameson
d8d766932a cleanup 2024-09-20 02:07:27 +03:00
Henry Jameson
71a4781080 at last... it's complete 2024-09-20 02:05:25 +03:00
Henry Jameson
0c91c37645 somehow i lost this file and had to rewrite it. now it's even better than before! 2024-09-19 21:42:14 +03:00
Henry Jameson
af3b2e3dc9 temp 2024-09-19 20:37:14 +03:00
HJ
23f8c08809 Merge branch 'update-prefixer' into 'develop'
Update prefixer settings and required gitlab runner tags

See merge request pleroma/pleroma-fe!1942
2024-09-19 15:29:29 +00:00
Henry Jameson
e089ca6d9a require himem runner to do building and tests 2024-09-19 18:25:37 +03:00
Henry Jameson
1794d52731 changelog 2024-09-19 15:43:38 +03:00
Henry Jameson
5d7a72cfd2 update browserslist and update versions we support 2024-09-19 15:40:52 +03:00
Henry Jameson
74e5bb9104 serializer working 2024-09-19 04:24:35 +03:00
Henry Jameson
80e8ea6fea re-align the mascot container 2024-09-18 21:35:10 +03:00
Henry Jameson
e004c4e087 remove splash when it's done 2024-09-18 21:33:20 +03:00
Henry Jameson
711eb24504 cleanup 2024-09-18 17:36:50 +03:00
HJ
537145e934 Merge branch 'tusooa/date-absolute' into 'develop'
Support displaying time in absolute format

See merge request pleroma/pleroma-fe!1938
2024-09-18 01:17:05 +00:00
Henry Jameson
82936aed38 cleanup, styles, fox random, and better "animation" for orz 2024-09-18 03:37:59 +03:00
Henry Jameson
414947d755 margin for credit 2024-09-18 02:54:38 +03:00
Henry Jameson
189bb02436 a11y 2024-09-18 02:54:25 +03:00
Henry Jameson
ce7ac02871 better error log 2024-09-18 02:50:51 +03:00
Henry Jameson
d2f85f4f25 revert interface.js since it's an action it will be always asynchronous 2024-09-18 02:49:27 +03:00
Henry Jameson
6c6d356f70 fix obvious mistakes 2024-09-18 02:41:55 +03:00
HJ
7c8308a410 Apply 1 suggestion(s) to 1 file(s) 2024-09-17 23:19:35 +00:00
tusooa
b14ba17256
Support displaying time in absolute format
This adds two config items: useAbsoluteTimeFormat (boolean) and
absoluteTimeFormatMinAge (string, number + unit ('d'|'h'|'m'|'s')).

When `useAbsoluteTimeFormat` is true, the Timeago component will display
absolute time if the time is at least `absoluteTimeFormatMinAge`
from now. If `longFormat` prop is true, the fully formatted time
is displayed. Otherwise, the format is determined by the `time` prop:
(1) if `time` is on the same day of now, display hour and minute;
(2) if `time` is in the same month of now, display day and hour;
(3) if `time` is in the same year of now, display month and day;
(4) otherwise, display year and month.

If it should display relative time, the format is the same as before.
2024-09-17 19:18:51 -04:00
Henry Jameson
05577aea54 replace toSorted with sort, add artist credit 2024-09-17 22:57:39 +03:00
Henry Jameson
7550b8cbd2 splashscreen is now smaller, big cleanup on aisle themes - removed a lot unnecessary sync/awaits and promises that were sequential anyway 2024-09-17 22:57:39 +03:00
Henry Jameson
6c5fc53789 fix production 2024-09-17 22:57:39 +03:00
Henry Jameson
5bbfa5ab25 attemt to fix production 2024-09-17 22:57:39 +03:00
Henry Jameson
2abde63afc swap pleromatan_apology_fox location 2024-09-17 22:57:39 +03:00
Henry Jameson
dc4cbbe830 fix symlink 2024-09-17 22:57:39 +03:00
Henry Jameson
bfc1091f7f ugh, json 2024-09-17 22:57:39 +03:00
Henry Jameson
6b37e5baec actual escape for real this time 2024-09-17 22:57:39 +03:00
Henry Jameson
d7059dbf3d escape 2024-09-17 22:57:39 +03:00
Henry Jameson
023c1d5ff0 oops 2024-09-17 22:57:39 +03:00
Henry Jameson
00df9c9c32 initial splashscreen implementation 2024-09-17 22:57:39 +03:00
Henry Jameson
a0c303efb6 fixed shadow preview, added more safeguards for spread on separateInset shadows 2024-09-16 00:03:40 +03:00
HJ
8ee5122909 Merge branch 'add-pdc-language' into 'develop'
add Pennsylvania Dutch to languages

See merge request pleroma/pleroma-fe!1935
2024-09-14 23:31:53 +00:00
HJ
5ad5f4c51e Apply 1 suggestion(s) to 1 file(s) 2024-09-14 20:23:06 +00:00
Henry Jameson
aa7a336183 Updated shadow control to be able to handle "absolute null" situation 2024-09-12 19:31:19 +03:00
Henry Jameson
2b9968eacd lint 2024-09-12 16:10:39 +03:00
Henry Jameson
a044dc377e Massively upgraded shadow control, added sorting by specificity in themes3, added/fixed disabled inputs 2024-09-12 15:54:23 +03:00
Henry Jameson
a586b9f6d2 fix themes3 specificity sorting 2024-09-12 12:46:47 +03:00
Henry Jameson
30c6eec1a1 Merge remote-tracking branch 'origin/develop' into add-pdc-language 2024-09-11 23:28:35 +03:00
Henry Jameson
8e8707bceb add Pennsylvania Dutch to languages 2024-09-11 21:17:35 +03:00
HJ
1667f1330c Merge branch 'weblate' into 'develop'
Translations update from Pleroma Weblate

See merge request pleroma/pleroma-fe!1929
2024-09-11 17:44:19 +00:00
Weblate Admin
a7719981fa Added translation using Weblate (Pennsylvania Dutch (pdc)) 2024-09-11 17:39:38 +00:00
Tirifto
250fcc0413 Translated using Weblate (Esperanto)
Currently translated at 92.0% (1098 of 1193 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/eo/
2024-09-04 14:20:03 +00:00
marcin mikołajczak
380a42a40b Translated using Weblate (Polish)
Currently translated at 57.1% (682 of 1193 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/pl/
2024-09-04 14:20:03 +00:00
Gllm R
260c067370 Translated using Weblate (French)
Currently translated at 94.5% (1128 of 1193 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/fr/
2024-09-04 14:20:03 +00:00
SyoBoN
9676e78736 Translated using Weblate (Japanese (ja_PEDANTIC))
Currently translated at 97.1% (1159 of 1193 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/ja_PEDANTIC/
2024-09-04 14:20:03 +00:00
Eric Zhang
1e1978b6a2 Translated using Weblate (Chinese (Simplified))
Currently translated at 99.6% (1189 of 1193 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/zh_Hans/
2024-09-04 14:20:03 +00:00
HJ
176dacb6ba Merge branch 'mergeback-master' into 'develop'
Merge master back into develop

See merge request pleroma/pleroma-fe!1934
2024-09-04 14:19:56 +00:00
Henry Jameson
0041faaed8 Merge remote-tracking branch 'origin/master' into develop 2024-09-04 17:18:50 +03:00
HJ
b553ed2d17 Merge branch 'hj/2.7.1-fixes' into 'master'
2.7.1 fixes

See merge request pleroma/pleroma-fe!1933
2024-09-04 14:16:49 +00:00
Henry Jameson
50b2e73efa 2.7.1 release 2024-09-04 17:02:08 +03:00
feld
bf00085946 Merge branch 'oauth-app-name' into 'develop'
Simplify the OAuth client_name

See merge request pleroma/pleroma-fe!1930
2024-09-01 16:12:39 +00:00
Mark Felder
06ebbaf7ba Simplify the OAuth client_name
Every time PleromaFE is used to login it will need to do the OAuth dance and request an app key. If the client name is not stable it will pollute the server's database with entries.

This also happens on every unauthenticated page load at the moment until #1339 is resolved
2024-09-01 12:09:07 -04:00
Mark Felder
5efa87e6c2 Simplify the OAuth client_name
Every time PleromaFE is used to login it will need to do the OAuth dance and request an app key. If the client name is not stable it will pollute the server's database with entries.

This also happens on every unauthenticated page load at the moment until #1339 is resolved
2024-09-01 12:03:24 -04:00
HJ
87fe063cb6 Apply 1 suggestion(s) to 1 file(s) 2024-08-28 21:18:35 +00:00
HJ
e7741e619d Apply 1 suggestion(s) to 1 file(s) 2024-08-28 21:17:37 +00:00
Henry Jameson
f5fbf9af64 fix nested panel headers 2024-08-28 23:54:46 +03:00
Pleroma Renovate Bot
072561764a Update dependency karma to v6.4.4 2024-08-24 17:58:56 +00:00
Pleroma Renovate Bot
5ea345313e Update dependency @ruffle-rs/ruffle to v0.1.0-nightly.2024.8.21 2024-08-24 17:58:48 +00:00
Henry Jameson
ab90dc9fb1 Revert all the user highlight stuff for now 2024-08-15 21:53:12 +03:00
Henry Jameson
a9c2d37315 ok i'm dumb, no manual caching needed tehepero 2024-08-15 21:49:45 +03:00
Henry Jameson
5384d3b7a2 fix solid color highlight 2024-08-15 20:43:11 +03:00
Henry Jameson
482f353f4d make posts have highlight on higher level 2024-08-15 11:35:33 +03:00
Henry Jameson
8b87d548ac didn't work, lol 2024-08-15 01:01:31 +03:00
Henry Jameson
5ad4d82b6b try to fix gaps 2024-08-15 00:57:23 +03:00
Henry Jameson
1f50fc2a8b oops 2024-08-15 00:06:32 +03:00
Henry Jameson
1b371afff3 fix instance theme not applying 2024-08-14 00:40:16 +03:00
Henry Jameson
cfba4cc6b3 don't do no-auto for themes2 seems to work better 2024-08-14 00:08:56 +03:00
Henry Jameson
99490cdb21 speed up emoji picker somewhat 2024-08-13 23:54:18 +03:00
Henry Jameson
c4352a1936 cache emoji groups etc 2024-08-13 22:51:17 +03:00
marcin mikołajczak
0878f5bfb4 Inform users that Smithereen public polls are public
Signed-off-by: marcin mikołajczak <git@mkljczk.pl>
2024-08-13 19:41:06 +02:00
HJ
6bc020c733 Merge branch 'release/2.7.x' into 'master'
Release 2.7.0

See merge request pleroma/pleroma-fe!1928
2024-07-31 16:31:06 +00:00
Henry Jameson
9d51eccf5d version bump 2024-07-31 18:16:00 +03:00
Henry Jameson
2b3c76cfb4 changelog for 2.7.0 2024-07-31 18:15:08 +03:00
HJ
83189d9d41 Merge branch 'fix-zoom-appearance-tab' into 'develop'
fix missing zoom in appearance tab

See merge request pleroma/pleroma-fe!1927
2024-07-26 12:42:22 +00:00
Henry Jameson
aa17a92d4a fix missing zoom in appearance tab 2024-07-26 15:41:00 +03:00
HJ
9e34e07a38 Merge branch 'fix-preview-interference' into 'develop'
fix theme preview styles being applied to post preview

See merge request pleroma/pleroma-fe!1926
2024-07-25 16:54:59 +00:00
Henry Jameson
27ee145450 fix theme preview styles being applied to post preview 2024-07-25 19:48:14 +03:00
HJ
23657e88ec Merge branch 'fix-broken-themes' into 'develop'
Fix broken themes

Closes #1330

See merge request pleroma/pleroma-fe!1925
2024-07-25 16:39:19 +00:00
Henry Jameson
88bce57c17 "changelog" 2024-07-25 19:35:24 +03:00
Henry Jameson
3baad46309 fix some broken themes found in wild 2024-07-25 19:19:46 +03:00
HJ
d5157fd4ca Merge branch 'fix-develop-issues' into 'develop'
Fix develop issues

See merge request pleroma/pleroma-fe!1924
2024-07-25 09:04:33 +00:00
Henry Jameson
e88cbe3421 "changelog" 2024-07-25 12:00:34 +03:00
Henry Jameson
d728fea3b1 fix language switcher 2024-07-25 11:58:58 +03:00
Henry Jameson
da5df6e684 more moving 2024-07-25 11:55:41 +03:00
Henry Jameson
e8d7d341f0 Merge remote-tracking branch 'origin/develop' into fix-develop-issues 2024-07-25 11:53:58 +03:00
Henry Jameson
0ca9a2c8c0 Fix font size and language switcher? 2024-07-25 11:49:18 +03:00
HJ
4797b13625 Merge branch 'fix-nonexistent-setting' into 'develop'
remove nonexistent setting (probably comatose contribution?)

See merge request pleroma/pleroma-fe!1923
2024-07-24 18:54:50 +00:00
Henry Jameson
b8ac355202 remove nonexistent setting (probably comatose contribution?) 2024-07-24 21:53:25 +03:00
HJ
0c9893c8a0 Merge branch 'appearance-tab' into 'develop'
Themes 3: Intermission: Appearance Tab and fixes

See merge request pleroma/pleroma-fe!1920
2024-07-24 18:51:17 +00:00
Henry Jameson
aa7bdbae21 rearrange tabs 2024-07-24 16:02:18 +03:00
Henry Jameson
5a929db010 fixed lack of gap in panel headers 2024-07-24 15:43:03 +03:00
tusooa
7a7d80270d Merge branch 'change/selenium-server' into 'develop'
Nightwatch config for selenium-server and gitignore changes

See merge request pleroma/pleroma-fe!1806
2024-07-24 03:04:14 +00:00
Henry Jameson
ece38e6876 spacing for number setting as well 2024-07-23 21:52:01 +03:00
Henry Jameson
355bcc49b7 increase gap in settings modal titlebar buttons 2024-07-23 21:46:22 +03:00
Henry Jameson
5d78d12c8d elaborates, refuses to leave 2024-07-23 21:36:20 +03:00
Henry Jameson
f4544f0742 elaboration and spacing 2024-07-23 21:35:29 +03:00
Henry Jameson
2928959138 fix huge previews on firefox 2024-07-23 16:29:54 +03:00
HJ
169f71c006 Apply 1 suggestion(s) to 1 file(s) 2024-07-22 19:53:06 +00:00
Henry Jameson
2c7f78a29f fix tests 2024-07-22 01:19:05 +03:00
Henry Jameson
c966364d1c changelogs 2024-07-22 00:00:07 +03:00
Henry Jameson
df22cc4bdd update icon 2024-07-21 23:53:24 +03:00
Henry Jameson
55d7ec4130 remove unused files 2024-07-21 23:49:37 +03:00
Henry Jameson
e984004c42 localization file fix 2024-07-21 23:49:13 +03:00
Henry Jameson
041da0cdff fix step not working in unit input 2024-07-21 23:46:54 +03:00
Henry Jameson
72b252c803 cleanup 2024-07-21 23:46:01 +03:00
Henry Jameson
4d3d075151 fix font selector losing list of local fonts when selecting one 2024-07-21 23:45:21 +03:00
Henry Jameson
665faf892a font overrides + fixes for font component 2024-07-21 23:27:11 +03:00
Henry Jameson
895261e112 comment out toposort console debug 2024-07-21 22:55:59 +03:00
Henry Jameson
c87d85edd8 cleanup console logs 2024-07-21 22:55:28 +03:00
HJ
d096962b05 Merge branch 'status-notification-type' into 'develop'
Support `status` notification type

See merge request pleroma/pleroma-fe!1916
2024-07-21 19:44:05 +00:00
HJ
f0f323b49c Merge branch 'speling' into 'develop'
Fix spelling errors

See merge request pleroma/pleroma-fe!1921
2024-07-17 22:48:45 +00:00
Mark Felder
fa1c02f4d4 Fix spelling errors
Submitted by: Jens of Fossies.org
2024-07-17 18:46:32 -04:00
Henry Jameson
9d5514de9c fix themes v2 editor for anon users and people who never touched themes 2024-07-17 22:25:14 +03:00
Henry Jameson
d2683a6728 new theme selector, RC 2024-07-17 22:10:11 +03:00
Henry Jameson
9bbdad1a6f theme selector new 2024-07-17 19:58:04 +03:00
Henry Jameson
1866dcfdc2 fix checkbox in preview 2024-07-17 17:26:03 +03:00
Henry Jameson
40c9163d21 optimizations, WIP theme selector 2024-07-17 17:19:57 +03:00
Henry Jameson
9d76fcc425 fix admin combo-dropdowns styles 2024-07-16 21:55:57 +03:00
Henry Jameson
a378c999b7 add ability to override underlay color/opacity regardless of theme 2024-07-16 21:01:20 +03:00
tusooa
cc2519b312 Merge branch 'weblate' into 'develop'
Translations update from Pleroma Weblate

See merge request pleroma/pleroma-fe!1915
2024-07-14 00:44:20 +00:00
Tirifto
b69dbf658a Translated using Weblate (Esperanto)
Currently translated at 92.5% (1062 of 1148 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/eo/
2024-07-12 17:02:45 +00:00
Henry Jameson
e029732021 use separate action for setting Theme V2 2024-07-12 02:40:57 +03:00
Henry Jameson
cd92eb56e0 don't recompile if cache exists 2024-07-12 02:19:38 +03:00
Henry Jameson
82ca01ef71 cleanup 2024-07-12 02:14:31 +03:00
Henry Jameson
115335e98a move theme application to interface module 2024-07-12 02:13:08 +03:00
Henry Jameson
41f8c3dad5 fix gaps in sticky headers 2024-07-11 14:54:37 +03:00
Henry Jameson
c6ccab778f MASSIVELY streamlined theme setting process, now EVERYTHING happens in a vuex action "setTheme" instead of several different applyTheme()s scattered around 2024-07-10 22:49:56 +03:00
Henry Jameson
8a41313bb4 "fix" theme preview 2024-07-04 03:20:26 +03:00
Henry Jameson
80cbf29bdf fields for user font overrides 2024-06-27 00:59:24 +03:00
Henry Jameson
925fd863fe Massively simplify and improve font input component 2024-06-27 00:34:25 +03:00
Henry Jameson
d5d37849ea font selector with proper styles and functionality + local font selector 2024-06-26 17:05:59 +03:00
Henry Jameson
eba3a43805 better font control custom input 2024-06-26 14:17:22 +03:00
Henry Jameson
a664cf352d fix unicode emoji 2024-06-26 02:21:16 +03:00
Henry Jameson
c27bbfd21c some improvements from testing prod 2024-06-26 02:15:32 +03:00
Henry Jameson
1e0d75782f Made the packs scroller a lot more bearable 2024-06-26 00:02:45 +03:00
Henry Jameson
8981448448 make emoji picker more scalable 2024-06-25 23:30:08 +03:00
Pleroma User
cdd0313d32 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (1148 of 1148 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/uk/
2024-06-23 05:02:41 +00:00
Henry Jameson
6846b4fe8a Merge remote-tracking branch 'origin/develop' into appearance-tab 2024-06-22 00:54:23 +03:00
SyoBoN
5e7916c9a6 Translated using Weblate (Japanese (ja_PEDANTIC))
Currently translated at 97.2% (1117 of 1148 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/ja_PEDANTIC/
2024-06-21 21:53:06 +00:00
SyoBoN
4597645cf7 Translated using Weblate (Japanese (ja_PEDANTIC))
Currently translated at 95.0% (1091 of 1148 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/ja_PEDANTIC/
2024-06-21 21:53:06 +00:00
HJ
4c3e297975 Merge branch 'tusooa/themesv3-on-safari' into 'develop'
Fix Themes v3 not working on Safari

Closes #1319

See merge request pleroma/pleroma-fe!1918
2024-06-21 21:53:00 +00:00
Henry Jameson
aae508f5a1 fix firefox redmond themes / fixed topbar and panel headers not having
proper theme2 inputs/alerts colors
2024-06-22 00:45:46 +03:00
Henry Jameson
f9e407de63 made theme debug easier by making it an actual option 2024-06-21 23:28:24 +03:00
Henry Jameson
eed05f1380 forced roundness tweak config 2024-06-21 22:46:01 +03:00
Henry Jameson
eca8da6593 fixed a "leak" that made too many <style> elements 2024-06-21 22:45:10 +03:00
Henry Jameson
1306c46a53 scale navbar font size with its size 2024-06-19 22:52:55 +03:00
Henry Jameson
59eb3e734a fix panel height for anon visitors 2024-06-19 22:52:42 +03:00
Henry Jameson
80639509b0 fix polls in notifications 2024-06-19 22:21:15 +03:00
Henry Jameson
a16e158216 better defaults, fonts scale with panel scale 2024-06-19 22:16:31 +03:00
Henry Jameson
fc04e24f56 fix overly large mobie nav 2024-06-13 11:27:54 +03:00
Henry Jameson
6343b91abf more scaling options 2024-06-13 02:22:47 +03:00
Henry Jameson
6142ac2bfc fix mobile layout navbar height 2024-06-13 01:28:54 +03:00
HJ
88f95e30e1 Merge branch 'fix/profile-mentions' into 'develop'
Fix profile mentions causing a 422 error

See merge request pleroma/pleroma-fe!1919
2024-06-07 17:38:53 +00:00
Mark Felder
631c2532aa Fix profile mentions causing a 422 error
The Pleroma backend now reports an error when trying to reply to a status it cannot resolve we assume it is deleted or nonexistent. PleromaFE was in_reply_to_id: true as an internal method to trigger populating the post status form with the username of the profile being viewed and this was being submitted to the API as a result.
2024-06-07 12:53:17 -04:00
marcin mikołajczak
34285150a0 Add tab to interactions.vue
Signed-off-by: marcin mikołajczak <git@mkljczk.pl>
2024-06-02 09:36:06 +02:00
tusooa
dc37c7b28b
Fix Themes v3 not working on Safari 2024-05-31 14:34:38 -04:00
HJ
e33734b474 Merge branch 'tusooa/no-preserve-selection-color' into 'develop'
Ensure selection text color has enough contrast

See merge request pleroma/pleroma-fe!1917
2024-05-31 13:49:06 +00:00
tusooa
3da6f8a2d1
Ensure selection text color has enough contrast 2024-05-31 09:39:31 -04:00
marcin mikołajczak
5c48ea2f1a Support status notification type
Signed-off-by: marcin mikołajczak <git@mkljczk.pl>
2024-05-25 08:42:32 +02:00
HJ
82db31f7ac Merge branch 'ci-update' into 'develop'
Update gitlab CI file to avoid arm runner that keeps failing certain resource-intensive tasks

See merge request pleroma/pleroma-fe!1914
2024-05-23 16:45:17 +00:00
HJ
5810f6f431 changelog 2024-05-23 08:38:17 +00:00
HJ
8b07d0201e Update gitlab CI file to avoid arm runner that keeps failing certain resource-intensive tasks 2024-05-23 08:36:15 +00:00
Henry Jameson
e4a819a0e2 initial Appearance Tab implementation, added text size/UI scale option 2024-05-22 19:54:19 +03:00
HJ
fd1011f622 Merge branch 'scrobbles-age' into 'develop'
Add setting to only show scrobbles newer than certain age.

See merge request pleroma/pleroma-fe!1904
2024-05-22 12:25:24 +00:00
Henry Jameson
eb27f1205b Merge branch 'scrobbles-age' of ssh://git.pleroma.social:2222/pleroma/pleroma-fe into scrobbles-age 2024-05-22 15:20:42 +03:00
Henry Jameson
daa39b6e8f changelog 2024-05-22 15:19:00 +03:00
HJ
3e99006e2a Merge branch 'quotes-count' into 'develop'
Display quotes count on posts and add quotes list page

See merge request pleroma/pleroma-fe!1885
2024-05-22 12:15:57 +00:00
HJ
e232ba0ec5 Merge branch 'weblate' into 'develop'
Translations update from Pleroma Weblate

See merge request pleroma/pleroma-fe!1910
2024-05-22 12:15:32 +00:00
HJ
3128ea57e1 Merge branch 'themes3-cache' into 'develop'
implement a simple caching system for themes 3

See merge request pleroma/pleroma-fe!1911
2024-05-22 12:15:21 +00:00
Phantasm
564cc73d31 Translated using Weblate (Czech)
Currently translated at 84.2% (960 of 1140 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/cs/
2024-04-30 20:02:13 +00:00
HJ
9d2572ffdb Update status.scss 2024-04-29 08:09:05 +00:00
HJ
a4264b9cd2 Apply 1 suggestion(s) to 1 file(s) 2024-04-29 07:39:00 +00:00
HJ
51709ad318 Merge branch 'develop' into 'scrobbles-age'
# Conflicts:
#   src/i18n/en.json
2024-04-28 19:05:18 +00:00
marcin mikołajczak
4de9daa114 Apply 1 suggestion(s) to 1 file(s)
Co-authored-by: marcin mikołajczak <me@mkljczk.pl>
2024-04-28 18:56:10 +00:00
Phantasm
b19749c320 Translated using Weblate (Czech)
Currently translated at 84.5% (960 of 1136 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/cs/
2024-04-28 17:29:25 +00:00
HJ
3056017f8e Merge branch 'eintei-port-mute-nsfw' into 'develop'
Ability to mute nsfw posts

Closes #1288

See merge request pleroma/pleroma-fe!1913
2024-04-28 17:29:17 +00:00
HJ
36f2fef55a Merge branch 'notif_types' into 'develop'
Add more notification types

See merge request pleroma/pleroma-fe!1912
2024-04-28 17:29:07 +00:00
Henry Jameson
6ff0a7f021 refactor sizesetting into unitsetting allowing more unit types with i18n support 2024-04-24 15:58:26 +03:00
Henry Jameson
6473260487 changelog 2024-04-24 15:25:21 +03:00
Henry Jameson
046678086f add explanation to why post is muted for sensitive muting 2024-04-24 15:22:19 +03:00
Alexander Tumin
59656af44c Allow muting sensitive posts in public timelines 2024-04-24 15:18:11 +03:00
Henry Jameson
6ea69eb51a checksum -> engineChecksum for clarity 2024-04-24 15:09:52 +03:00
Henry Jameson
c40b02ac2f changelog 2024-04-22 23:46:12 +03:00
Henry Jameson
af236d71f0 changelog 2024-04-22 23:42:08 +03:00
Henry Jameson
5505a89e8a implement a simple caching system for themes 3 2024-04-22 23:40:39 +03:00
Henry Jameson
b2e10ac8c1 add more notification types to ask backend about 2024-04-22 22:37:37 +03:00
HJ
15dde2d372 Merge branch 'fix-poll-notifs' into 'develop'
Add poll end notifications to fetched types

Closes pleroma#3230

See merge request pleroma/pleroma-fe!1905
2024-04-22 19:30:29 +00:00
HJ
2cbfcb6a6d Merge branch 'tusooa/status-loading-indicator' into 'develop'
Display loading and error indicator for conversation page

See merge request pleroma/pleroma-fe!1907
2024-04-22 19:23:52 +00:00
HJ
e853d746b0 Merge branch 'weblate' into 'develop'
Translations update from Pleroma Weblate

See merge request pleroma/pleroma-fe!1909
2024-04-18 08:25:22 +00:00
SyoBoN
2ede1f669a Translated using Weblate (Japanese (ja_PEDANTIC))
Currently translated at 96.0% (1091 of 1136 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/ja_PEDANTIC/
2024-04-17 23:37:32 +00:00
HJ
09313a9fcd Merge branch 'public-favorites' into 'develop'
Fix fetching favorites for own profile

See merge request pleroma/pleroma-fe!1908
2024-04-16 08:16:33 +00:00
marcin mikołajczak
1ceffb4e71 Fix fetching favorites for own profile
Signed-off-by: marcin mikołajczak <git@mkljczk.pl>
2024-04-15 23:54:46 +02:00
tusooa
b173741f87
Display loading and error indicator for conversation page 2024-04-14 11:46:29 -04:00
tusooa
39269c4829 Merge branch 'weblate' into 'develop'
Translations update from Pleroma Weblate

See merge request pleroma/pleroma-fe!1893
2024-04-14 15:21:46 +00:00
Gllm R
3d025eb7bf Translated using Weblate (French)
Currently translated at 99.2% (1128 of 1136 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/fr/
2024-04-07 18:02:12 +00:00
Gllm R
d6ef47f1c3 Translated using Weblate (French)
Currently translated at 83.9% (954 of 1136 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/fr/
2024-04-06 14:54:05 +00:00
jammer lammer
82af61f5b4 Translated using Weblate (Portuguese)
Currently translated at 69.8% (793 of 1136 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/pt/
2024-04-06 14:54:05 +00:00
Phantasm
eb03844387 Translated using Weblate (Czech)
Currently translated at 84.5% (960 of 1136 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/cs/
2024-04-06 14:54:05 +00:00
Phantasm
b610caeca8 Translated using Weblate (English)
Currently translated at 100.0% (1136 of 1136 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/en/
2024-04-06 14:54:05 +00:00
Phantasm
9b65c30c12 Translated using Weblate (Czech)
Currently translated at 74.8% (850 of 1136 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/cs/
2024-04-06 14:54:05 +00:00
Phantasm
1b667fbb01 Translated using Weblate (English)
Currently translated at 100.0% (1136 of 1136 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/en/
2024-04-06 14:54:05 +00:00
HJ
0635a6c131 Merge branch 'themes3-fixes' into 'develop'
Themes 3 fixes

Closes #1301 and #1303

See merge request pleroma/pleroma-fe!1906
2024-04-06 14:53:53 +00:00
Henry Jameson
3eabdf9ded lint 2024-04-04 22:58:50 +03:00
Henry Jameson
ece159822c force user profile links in summary to be text colored... for now. 2024-04-04 22:50:04 +03:00
Henry Jameson
c0010d0f48 fix transparent popovers 2024-04-04 22:45:13 +03:00
Henry Jameson
8ead084421 fix #1301 2024-04-04 22:40:50 +03:00
Henry Jameson
19ab07af96 changelog 2024-04-03 23:08:13 +03:00
Henry Jameson
1c23a16bac try to apply lazy part in one go while still having chunked processing 2024-04-03 22:57:44 +03:00
Henry Jameson
9806eea12e only show interface after theme has been applied 2024-04-03 22:52:12 +03:00
Henry Jameson
e8159164e3 color input improvements 2024-04-03 22:43:36 +03:00
Henry Jameson
dd4867d8de refactor style setter to separate theme generation from theme application 2024-04-03 22:42:34 +03:00
Henry Jameson
2382810823 fix repeater links 2024-04-03 21:27:25 +03:00
Henry Jameson
fbea4f9986 fix shout 2024-04-03 21:27:19 +03:00
Henry Jameson
940df1efa7 add fallbacks for lazy stuff loading 2024-04-03 21:10:27 +03:00
Henry Jameson
9bdc8d9b9c fix transparency blur in statuses on firefox 2024-03-29 13:36:43 +02:00
Phantasm
d5575f9c13
Add poll end notifications to fetched types 2024-03-26 19:17:55 +01:00
HJ
d7f744d281 Merge branch 'themes3' into 'develop'
Themes 3.0 / Pleroma ISS (Interface Style Sheets) [Side A]

See merge request pleroma/pleroma-fe!1892
2024-03-26 17:13:41 +00:00
Henry Jameson
c298611af2 fix tests and make them pass on shit hardware 2024-03-26 18:49:29 +02:00
Henry Jameson
300b3a2517 fix emoji react buttons in notifications sidebar 2024-03-26 17:20:53 +02:00
Henry Jameson
def68e9cda scrobbles age setting 2024-03-25 23:35:28 +02:00
Henry Jameson
4c10cf21a0 please the stylint 2024-03-25 19:13:04 +02:00
Henry Jameson
f3d3901a92 more tests 2024-03-25 19:07:28 +02:00
Henry Jameson
c1568ad2ba fix massive issue in getAllPossibleCombinations 2024-03-25 18:18:48 +02:00
Henry Jameson
1050fed558 fix non-round panel headers 2024-03-25 17:02:36 +02:00
Henry Jameson
e51278cdf1 Merge remote-tracking branch 'origin/develop' into themes3 2024-03-25 16:54:40 +02:00
Henry Jameson
b925c32e67 Make unloaded statuses follow panel styling 2024-03-25 16:38:03 +02:00
Henry Jameson
46562d5318 fix unnecessary backdrop filter in timelines 2024-03-25 16:30:21 +02:00
Henry Jameson
4852f5b833 unify tabs fixes for panels 2024-03-25 16:29:24 +02:00
Henry Jameson
d02a15043e fix two most annoying remaining bugs (incorrect hover in chats and
overflowing avatars in interactors section)
2024-03-25 13:08:30 +02:00
Pleroma Renovate Bot
148796b266 Update dependency karma-firefox-launcher to v2.1.3 2024-03-23 09:09:00 +00:00
HJ
23edfe7b91 Merge branch 'non-expiring-polls' into 'develop'
Hide the expiry date indication if the poll never expires

Closes #961

See merge request pleroma/pleroma-fe!1889
2024-03-22 08:17:33 +00:00
HJ
698d608591 Merge branch 'renovate/autoprefixer-10.x' into 'develop'
Update dependency autoprefixer to v10.4.19

See merge request pleroma/pleroma-fe!1898
2024-03-21 09:30:02 +00:00
Pleroma Renovate Bot
fa7f6955a1 Update dependency autoprefixer to v10.4.19 2024-03-21 09:06:07 +00:00
Pleroma Renovate Bot
112ca85d91 Update dependency @vue/babel-plugin-jsx to v1.2.2 2024-03-20 08:52:22 +00:00
HJ
6147f71977 Merge branch 'renovate/babel-loader-9.x' into 'develop'
Update dependency babel-loader to v9.1.3

See merge request pleroma/pleroma-fe!1895
2024-03-19 14:11:30 +00:00
Pleroma Renovate Bot
69a8ab7a03 Update dependency babel-loader to v9.1.3 2024-03-19 08:52:42 +00:00
HJ
90082a0d04 Merge branch 'renovate/autoprefixer-10.x' into 'develop'
Update dependency autoprefixer to v10.4.18

See merge request pleroma/pleroma-fe!1878
2024-03-18 13:36:18 +00:00
HJ
c0961a4420 Merge branch 'renovate/vue-babel-plugin-jsx-1.x' into 'develop'
Update dependency @vue/babel-plugin-jsx to v1.2.1

See merge request pleroma/pleroma-fe!1856
2024-03-18 13:35:56 +00:00
HJ
b252af872f Merge branch 'renovate/js-cookie-3.x' into 'develop'
Update dependency js-cookie to v3.0.5

See merge request pleroma/pleroma-fe!1818
2024-03-18 13:35:14 +00:00
HJ
539deb607f Merge branch 'renovate/ungap-event-target-0.x' into 'develop'
Update dependency @ungap/event-target to v0.2.4

See merge request pleroma/pleroma-fe!1813
2024-03-18 09:53:17 +00:00
HJ
7e05be9251 Merge branch 'renovate/nightwatch-2.x' into 'develop'
Update dependency nightwatch to v2.6.25

See merge request pleroma/pleroma-fe!1831
2024-03-18 09:52:05 +00:00
HJ
255512938c Merge branch 'renovate/ruffle-rs-ruffle-0.x' into 'develop'
Update dependency @ruffle-rs/ruffle to v0.1.0-nightly.2024.3.17

See merge request pleroma/pleroma-fe!1662
2024-03-18 09:51:42 +00:00
HJ
09da683d28 Merge branch 'renovate/css-loader-6.x' into 'develop'
Update dependency css-loader to v6.10.0

See merge request pleroma/pleroma-fe!1829
2024-03-18 09:51:24 +00:00
HJ
d8c50854b7 Merge branch 'renovate/vuelidate-validators-2.x' into 'develop'
Update dependency @vuelidate/validators to v2.0.4

See merge request pleroma/pleroma-fe!1805
2024-03-18 09:51:00 +00:00
Pleroma Renovate Bot
0daa824ec1 Update dependency @ruffle-rs/ruffle to v0.1.0-nightly.2024.3.17 2024-03-17 09:06:04 +00:00
Henry Jameson
472aad52e1 Use constructed stylesheet to prevent chrome from shitting itself when
you open element picker
2024-03-12 23:33:24 +02:00
tusooa
7ee55da4a3 Merge branch 'weblate' into 'develop'
Translations update from Pleroma Weblate

See merge request pleroma/pleroma-fe!1888
2024-03-07 01:59:09 +00:00
Henry Jameson
1e467ac6e1 update tests 2024-03-07 01:08:04 +02:00
Henry Jameson
afc94c6801 lint 2024-03-07 00:38:19 +02:00
Henry Jameson
34f23b992e fix conversations panels shadows 2024-03-07 00:37:21 +02:00
Henry Jameson
6d77bc2bd5 more transparent panels fixes 2024-03-07 00:28:16 +02:00
Henry Jameson
ce5552ae3c fix more transparent panels 2024-03-06 20:35:03 +02:00
Henry Jameson
1b391b6a69 fix dialogs not having styles at all 2024-03-06 20:27:05 +02:00
Henry Jameson
7d1e787f55 fix unstyled buttons focus+active+hover styles 2024-03-06 17:42:09 +02:00
Henry Jameson
7df207c9d4 emoji management fixes for themes3 2024-03-06 10:34:56 +02:00
Henry Jameson
962bce5ee3 Merge remote-tracking branch 'origin/develop' into themes3 2024-03-06 09:35:46 +02:00
Kian-ting Tan
e96487ffd5 Translated using Weblate (Chinese (Min Nan) (nan_TW))
Currently translated at 97.9% (1070 of 1092 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/nan_TW/
2024-03-05 16:29:29 +00:00
SyoBoN
016c69e466 Translated using Weblate (Japanese (ja_PEDANTIC))
Currently translated at 98.0% (1071 of 1092 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/ja_PEDANTIC/
2024-03-05 16:29:29 +00:00
Phantasm
9c2046e6a7 Translated using Weblate (Czech)
Currently translated at 74.6% (815 of 1092 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/cs/
2024-03-05 16:29:29 +00:00
Phantasm
e22f571874 Translated using Weblate (Czech)
Currently translated at 71.2% (778 of 1092 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/cs/
2024-03-05 16:29:29 +00:00
SyoBoN
a104098467 Translated using Weblate (Japanese (ja_PEDANTIC))
Currently translated at 98.0% (1071 of 1092 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/ja_PEDANTIC/
2024-03-05 16:29:29 +00:00
SyoBoN
c29c524033 Translated using Weblate (Japanese (ja_PEDANTIC))
Currently translated at 96.4% (1053 of 1092 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/ja_PEDANTIC/
2024-03-05 16:29:29 +00:00
Phantasm
40fa9b6ae4 Translated using Weblate (Czech)
Currently translated at 67.3% (732 of 1087 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/cs/
2024-03-05 16:29:29 +00:00
HJ
943fee9fbc Merge branch 'admin-emoji-settings' into 'develop'
Admin emoji pack settings

See merge request pleroma/pleroma-fe!1886
2024-03-05 16:29:21 +00:00
Henry Jameson
3239bd34df fix poll options 2024-03-04 23:02:21 +02:00
Henry Jameson
7f38d7d474 fix popovers 2024-03-04 22:52:54 +02:00
Henry Jameson
e4f2741989 fix 2024-03-04 22:40:44 +02:00
Henry Jameson
dc631c68fd fix some mistakes 2024-03-04 22:31:40 +02:00
Henry Jameson
b10458e3a3 lint 2024-03-04 21:40:35 +02:00
Henry Jameson
8d99e2138a fix mentionsline buttons 2024-03-04 20:20:32 +02:00
Henry Jameson
7b1f70468b fix link preview text 2024-03-04 20:10:35 +02:00
Henry Jameson
5637e29d9c fix smol utf emoji in suggestor 2024-03-04 20:06:30 +02:00
Henry Jameson
f7cd801e69 fix mentions selection 2024-03-04 19:56:06 +02:00
Henry Jameson
7e01d2083d proper selection colors 2024-03-04 19:53:45 +02:00
Henry Jameson
075f2cb903 remove all "fallback variables" 2024-03-04 19:45:42 +02:00
Henry Jameson
50a9c077fb fix new chat window 2024-03-04 19:24:18 +02:00
Henry Jameson
7238b218f9 fix badgeNotification for themes2 2024-03-04 19:10:23 +02:00
Henry Jameson
545c875a85 process chunks strictly sequentially to avoid overloading the event
queue
2024-03-04 19:03:29 +02:00
Henry Jameson
a190389f3c panels/statuses are looking really good now even with transparency 2024-03-04 18:24:29 +02:00
Pleroma Renovate Bot
e91e12b4b6 Update dependency autoprefixer to v10.4.18 2024-03-02 09:06:02 +00:00
HJ
db33d58ba7 Merge branch 'revert-6391a6a4' into 'develop'
Reduce the timestamp pf videos so that they start at beginning

See merge request pleroma/pleroma-fe!1890
2024-02-29 20:08:03 +00:00
Henry Jameson
45a4b204c8 changelog 2024-02-29 22:04:10 +02:00
HJ
0f2c5fd972 Apply 1 suggestion(s) to 1 file(s) 2024-02-29 19:57:27 +00:00
Henry Jameson
a2f2a0e409 fix autocomplete 2024-02-29 20:15:41 +02:00
Henry Jameson
01f6f89c7d interactive lists & non-interactive lists 2024-02-29 19:54:25 +02:00
Henry Jameson
23a8bee053 fix more attachments issues 2024-02-29 19:30:54 +02:00
Henry Jameson
fb55c98483 fix polls options 2024-02-29 19:06:50 +02:00
Henry Jameson
e7c64e47c4 undo the removal of toggled state for unstyled button since it is used 2024-02-29 18:52:27 +02:00
Henry Jameson
54e3a99bc7 Merge remote-tracking branch 'origin/develop' into themes3 2024-02-29 18:49:23 +02:00
Henry Jameson
73f6ecb21e clean up some variables, fixing search footer 2024-02-29 18:07:15 +02:00
Henry Jameson
78dcc0423e improve popover shadows (to not overlap with border) 2024-02-29 17:50:11 +02:00
Henry Jameson
28c7fac9f0 implement list item styles 2024-02-29 17:49:56 +02:00
Henry Jameson
3f6b9fbf9c user cards looking nicer now 2024-02-28 22:56:15 +02:00
Henry Jameson
7575079da9 fix badge-notificaiton color in favicon and notifications 2024-02-28 22:28:15 +02:00
Henry Jameson
cf1345caca more scrollbars work 2024-02-28 15:04:01 +02:00
Henry Jameson
8e3637c059 improve scrollbars, add avatar to menu-item since it appears in
autocomplete, add wallpaper color
2024-02-28 14:57:19 +02:00
Henry Jameson
39eee4412f fix alerts in panels 2024-02-28 14:25:22 +02:00
Henry Jameson
528e7e4496 fix more annoying themes2->3 button states 2024-02-28 13:10:42 +02:00
Henry Jameson
15d8daa7ec somehow i missed this one 2024-02-28 12:51:22 +02:00
Henry Jameson
e2a675e3ae oops 2024-02-28 01:26:22 +02:00
Henry Jameson
fe93717d47 consistent menu-items 2024-02-28 01:23:43 +02:00
Henry Jameson
f4d48e401a fix reply link being faint (didn't work before, no reason to keep it
"faint" imo)
2024-02-27 22:20:41 +02:00
Henry Jameson
ec2afce97e improve performance a bit and use better "worst case" color 2024-02-27 22:02:44 +02:00
Henry Jameson
e2af986323 fix global notices 2024-02-27 22:02:25 +02:00
Henry Jameson
eab3bfaf0d remove fallbacks from shadow control 2024-02-27 21:43:25 +02:00
Henry Jameson
d134b691cc remove button-unstyled from video attachments 2024-02-27 17:04:56 +02:00
Henry Jameson
c83ddb0b2b better v1 detection, better menu-item consistency 2024-02-27 17:03:39 +02:00
Henry Jameson
d3b5f76486 fix mobile drawer menu items not being fullwidth 2024-02-27 01:09:27 +02:00
Henry Jameson
d8827932bc fix collapsed notifications incorrect styles 2024-02-27 01:08:04 +02:00
Henry Jameson
adc47ad38a no more side effects, virtual components have their own css rules
instead of updating lower level
2024-02-27 00:55:19 +02:00
Henry Jameson
9a24d21bbd fix mobile badge in timeline 2024-02-27 00:16:22 +02:00
Henry Jameson
ef2c8f077d refactor and optimize: now lazy rules are processed in chunks 2024-02-27 00:07:45 +02:00
Henry Jameson
dc22386599 optimization and refactoring, rules are first flattened and then
processed, letting us to set individual rules as "lazy"
2024-02-26 21:37:40 +02:00
Henry Jameson
ac85cdac68 fix themes v1 not working 2024-02-22 19:24:26 +02:00
Henry Jameson
c4d218cb3e fix anon view 2024-02-22 19:15:55 +02:00
Henry Jameson
9bbf2e70c2 lint 2024-02-22 18:39:52 +02:00
Henry Jameson
1640bb61e3 last remaining core tasks done 2024-02-22 18:38:45 +02:00
Henry Jameson
339ae3e95e disable debug stuff i left on by accident in last commit 2024-02-22 18:20:09 +02:00
Henry Jameson
abd1407a0b fix emoji inputs having odd paddings and line-height 2024-02-22 18:19:28 +02:00
Henry Jameson
6536fe229b fix change not being recognized 2024-02-22 18:10:30 +02:00
Henry Jameson
623a961141 changelog to make pipelines happy 2024-02-22 18:07:56 +02:00
Henry Jameson
7d2faccd4f fonts support, cleanup 2024-02-22 18:04:28 +02:00
Henry Jameson
779b3dc122 blur support, fix toggled buttons not working right 2024-02-22 15:15:08 +02:00
Henry Jameson
09e0e53ad6 opacity stuff, better debug mode 2024-02-22 14:36:56 +02:00
Henry Jameson
9e66c1184f fix notifications links 2024-02-22 01:32:52 +02:00
Henry Jameson
7f465cfdb1 fix mobile notifications 2024-02-22 01:11:47 +02:00
Henry Jameson
5e0ba2bcd9 initial work on mobile stuff 2024-02-22 01:10:24 +02:00
Henry Jameson
099a2eb27f proper polls support 2024-02-22 00:31:20 +02:00
Henry Jameson
4785c553ef small tabs improvements 2024-02-22 00:06:51 +02:00
Henry Jameson
879f520b75 tabs support + cleanup 2024-02-22 00:02:24 +02:00
Henry Jameson
8a21594dbc shadow slots work + minor fixes 2024-02-21 22:18:56 +02:00
Henry Jameson
7041d29ede add attachment to panel for post form compat 2024-02-21 14:15:25 +02:00
Henry Jameson
d2f4ce442a fix attachment inputs 2024-02-21 14:05:26 +02:00
Henry Jameson
f609aaba0c improve checkbox styles 2024-02-21 13:10:11 +02:00
Henry Jameson
8a47069cee improve default button styles 2024-02-21 12:33:43 +02:00
Henry Jameson
900eb34186 improve backwards compat for avatar shadows 2024-02-21 12:33:33 +02:00
Henry Jameson
da0db933d9 moved themes2 stuff into theme_data.service.js 2024-02-21 12:23:10 +02:00
Henry Jameson
c3e6e7c61d improvements to backcompat + fixes to topbar 2024-02-20 01:18:21 +02:00
Henry Jameson
2172529dd0 backwards compat WORKING 2024-02-20 01:05:17 +02:00
Henry Jameson
0285efadbb independence from themes3, converter/backwards compat WIP 2024-02-19 20:47:27 +02:00
Henry Jameson
23dc2d1a5b refactor ISS stuff into separate file 2024-02-19 20:05:49 +02:00
Henry Jameson
4a10417ed4 initial work on dynamic slots + move remaining css stuff into separate file 2024-02-19 19:59:38 +02:00
Henry Jameson
34aa9136db refactored most of the CSS stuff into separate file, refactored color
functions and added shadow functions, replaced JS functions in button
with PISS functions
2024-02-19 18:48:49 +02:00
Henry Jameson
11fd220734 chat styles + related improvements 2024-02-19 15:11:59 +02:00
Henry Jameson
ab63ec1471 make dynamic directives have a type 2024-02-19 00:25:28 +02:00
Henry Jameson
3b520a98ad fix panel borders 2024-02-19 00:22:31 +02:00
Henry Jameson
1bc1a83a1f fix borders in statuses and linear view 2024-02-19 00:21:44 +02:00
Henry Jameson
f4bf374509 cleanup and warn if there are collisions in .style.js files 2024-02-19 00:12:07 +02:00
Henry Jameson
6811191147 i'm stupid 2024-02-19 00:10:10 +02:00
Henry Jameson
f0bbb75df5 properly sort, properly do icon colors, some initial attachment buttons work 2024-02-19 00:00:43 +02:00
Henry Jameson
13a289ac74 fixed oot selectors not working, added support for (webkit) scrollbars 2024-02-18 20:11:06 +02:00
Henry Jameson
3e198526e6 dynamically load .style.js files; move the files closer to related components 2024-02-18 18:40:14 +02:00
Pleroma Renovate Bot
1be1bdfa41 Update dependency nightwatch to v2.6.25 2024-02-17 09:06:38 +00:00
Henry Jameson
7c77809ff9 badge, alert(dot) improvements 2024-02-16 00:29:16 +02:00
Henry Jameson
96e3a1593a more optimizations, execution is now split into eager (for main UI) and
lazy (for modals, popovers etc) parts
2024-02-15 20:20:27 +02:00
Henry Jameson
34e4dd0a79 fix last border of menu-item 2024-02-13 02:31:33 +02:00
Henry Jameson
c531391e87 fix post status form input 2024-02-13 02:31:11 +02:00
Henry Jameson
c16f1d4e35 more fixes 2024-02-13 02:27:53 +02:00
Henry Jameson
bcc5084409 add roundness, fix inputs 2024-02-13 02:09:43 +02:00
Henry Jameson
17b25ef0e0 avatar shadows 2024-02-12 19:58:42 +02:00
Henry Jameson
709ce1611a remove panel from popover since it's never used anywhere 2024-02-12 19:27:51 +02:00
Henry Jameson
48f106b438 separate greentext into "fun text" and make Post/Notification related components 2024-02-12 19:17:17 +02:00
Henry Jameson
ae345d2c45 buttons look great now, including unstyled ones menu items work too 2024-02-12 17:26:08 +02:00
Henry Jameson
1c5f156af0 better button styles, include popovers in root 2024-02-12 03:46:40 +02:00
Henry Jameson
98f972e557 menu-item improvements 2024-02-11 23:11:28 +02:00
Henry Jameson
9ec61d0f0a comments and cleanup 2024-02-09 19:37:22 +02:00
Henry Jameson
1af8ca29f3 optimize combinatorics and defaults, now it's twice as fast! 2024-02-09 16:04:45 +02:00
Henry Jameson
1cfdde819b don't use lodash (-~300ms speed) 2024-02-09 15:52:11 +02:00
Henry Jameson
79d2184afa more performance testing 2024-02-08 18:36:59 +02:00
Henry Jameson
6df28cde9d improvements & performance testing 2024-02-08 18:18:01 +02:00
Henry Jameson
a7d771e8c8 more dynamic vars, PROPER ICON COLORS 2024-02-07 18:54:00 +02:00
Henry Jameson
1229bbd855 don't use no-auto for icons for now 2024-02-07 16:17:53 +02:00
Henry Jameson
85d55c55e7 add directive to completely disable automatic text color creation 2024-02-07 16:15:25 +02:00
Henry Jameson
a9efbd2553 add directive to preserve or not the text color 2024-02-07 16:09:29 +02:00
Henry Jameson
d2a74ea1a2 add .input class to all inputs 2024-02-07 15:53:49 +02:00
Henry Jameson
c34590c439 update, should inherit stuff properly now. 2024-02-07 15:53:34 +02:00
Henry Jameson
d4795d2e3c moved default rules to component style.js files, added some basic text inheritance 2024-02-01 01:27:30 +02:00
Henry Jameson
53a4b1f9a6 better virtual components and stuff 2024-01-31 17:39:51 +02:00
Pleroma Renovate Bot
7c8b9610b9 Update dependency css-loader to v6.10.0 2024-01-31 08:55:58 +00:00
HJ
303bfa6e39 Revert "Merge branch 'video-poster' into 'develop'"
This reverts merge request !1879
2024-01-29 22:54:10 +00:00
Ekaterina Vaartis
70258a2176 Address the save and delete button bugs 2024-01-28 00:03:22 +03:00
SyoBoN
8562fd2da6
Add changelog
Signed-off-by: SyoBoN <syobon@syobon.net>
2024-01-26 17:57:00 +09:00
SyoBoN
062323c0d5
Hide the expiry date indication if the poll never expires
Signed-off-by: SyoBoN <syobon@syobon.net>
2024-01-26 17:57:00 +09:00
tusooa
9042792133 Merge branch 'tusooa/group-actor' into 'develop'
Support group actors

See merge request pleroma/pleroma-fe!1882
2024-01-24 01:50:45 +00:00
Henry Jameson
ff2db7a247 fix states 2024-01-23 20:39:52 +02:00
Henry Jameson
22b32f149d shit more or less works for the very basic stuff 2024-01-23 19:18:55 +02:00
Pleroma Renovate Bot
d8c22a9e42 Update dependency @vue/babel-plugin-jsx to v1.2.1 2024-01-23 08:56:34 +00:00
Henry Jameson
0729b529d7 some more stuff, generating CSS selectors from rules 2024-01-23 00:43:46 +02:00
Ekaterina Vaartis
d5a5b8e254 Fix typo, add warning on replacing local pack 2024-01-22 23:43:20 +03:00
Ekaterina Vaartis
4d7a915154 displayError event, 'emits', "Edit pack" label 2024-01-22 23:14:49 +03:00
Ekaterina Vaartis
8a030d935b Separate emoji editing and upload into a separate component
Handle all state in that component
2024-01-19 23:16:21 +03:00
marcin mikołajczak
d28e48e9dc Merge remote-tracking branch 'mkljczk/quotes-count' into quotes-count 2024-01-19 19:01:38 +01:00
marcin mikołajczak
f6d3a66a5b shouldDisplayFavsAndRepeats
Signed-off-by: marcin mikołajczak <git@mkljczk.pl>
2024-01-19 19:01:11 +01:00
Ekaterina Vaartis
aa49838355 Adjust h-element levels to be smaller 2024-01-19 19:24:36 +03:00
Ekaterina Vaartis
a2133f5283 Rearrange stuff in accordance with comments on the MR, mostly
Also, add support for a custom message to the modified indicator
2024-01-18 16:24:55 +03:00
Henry Jameson
521d308a6c themes 3 initial work 2024-01-18 14:35:25 +02:00
HJ
b0d0a3faf6 Merge branch 'upstream-hide-custom-emoji' into 'develop'
Add ability to hide custom emojis in picker

See merge request pleroma/pleroma-fe!1887
2024-01-17 13:23:33 +00:00
Phantasm
88a006eb1a Add ability to hide custom emojis in picker 2024-01-17 13:23:33 +00:00
marcin mikołajczak
dbe9da0f09 Merge branch 'develop' into 'quotes-count'
# Conflicts:
#   src/services/api/api.service.js
2024-01-14 06:23:30 +00:00
HJ
ae4e360157 Merge branch 'tusooa/registration-notice' into 'develop'
Show a dedicated registration notice page when further action is required after registering

See merge request pleroma/pleroma-fe!1851
2024-01-13 23:44:06 +00:00
tusooa
9277a0cc0c Merge branch 'weblate' into 'develop'
Translations update from Pleroma Weblate

See merge request pleroma/pleroma-fe!1884
2024-01-13 23:07:20 +00:00
tusooa
209c0a8332
Remove empty else branch and detail the comments 2024-01-13 17:44:13 -05:00
tusooa
82c0044963
Show a dedicated registration notice page when further action is required after registering 2024-01-13 17:41:57 -05:00
tusooa
9ec61c07ef Translated using Weblate (Chinese (Simplified))
Currently translated at 98.3% (1068 of 1086 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/zh_Hans/
2024-01-13 22:37:29 +00:00
tusooa
f5b4b5f777 Merge branch 'public-favorites' into 'develop'
Display public favorites on user profiles if enabled

See merge request pleroma/pleroma-fe!1883
2024-01-13 22:37:22 +00:00
Ekaterina Vaartis
872dffe51b Implement pack pagination, more localization fixes 2024-01-07 16:41:17 +03:00
Ekaterina Vaartis
4eeb3e5f78 Update localization 2024-01-07 14:58:41 +03:00
Ekaterina Vaartis
c218f32f6b Add a changelog entry 2024-01-07 14:50:17 +03:00
Ekaterina Vaartis
f8e1d5e3e0 Remote pack download, localization 2024-01-07 14:28:34 +03:00
Ekaterina Vaartis
4451cccb3c Error handling, uploading/deleting new emojis, sorting 2024-01-07 12:26:40 +03:00
Ekaterina Vaartis
091532d577 Editing emojis in popover, pack creation/deletion
Also fixed some API calls since they weren't working apparently
2024-01-07 02:45:49 +03:00
marcin mikołajczak
6c4c8fe51f Display quotes count on posts and add quotes list page
Signed-off-by: marcin mikołajczak <git@mkljczk.pl>
2024-01-04 22:47:41 +01:00
tusooa
bdf46eca5a Merge branch 'weblate' into 'develop'
Translations update from Pleroma Weblate

See merge request pleroma/pleroma-fe!1881
2023-12-31 21:19:38 +00:00
SyoBoN
f3cdcaa172 Translated using Weblate (Japanese (ja_PEDANTIC))
Currently translated at 96.5% (1049 of 1086 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/ja_PEDANTIC/
2023-12-31 13:01:33 +00:00
Xnuk Shuman
3c4eaaab2c Translated using Weblate (Korean)
Currently translated at 97.6% (1061 of 1086 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/ko/
2023-12-30 05:01:33 +00:00
nixe neko
f177e0fe24 Translated using Weblate (Japanese (ja_EASY))
Currently translated at 91.8% (997 of 1086 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/ja_EASY/
2023-12-28 15:01:33 +00:00
marcin mikołajczak
6f452d672f Display public favorites on user profiles
Signed-off-by: marcin mikołajczak <git@mkljczk.pl>
2023-12-28 10:43:06 +01:00
tusooa
16f326216a
Add changelog for group actors 2023-12-27 22:56:47 -05:00
tusooa
a709127a3c
Use actor type to determine whether a user is a bot 2023-12-27 22:55:58 -05:00
tusooa
cc4aaccf38
Implement indicator for groups 2023-12-27 22:54:44 -05:00
tusooa
fd77270564
Make user card group-aware 2023-12-27 22:40:07 -05:00
tusooa
4777bec85f
Add a description on what groups do 2023-12-27 22:36:13 -05:00
tusooa
0110fd86c2
Allow user to mark account as group 2023-12-27 22:30:19 -05:00
SyoBoN
b8a036ee64 Translated using Weblate (Japanese (ja_PEDANTIC))
Currently translated at 96.5% (1048 of 1086 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/ja_PEDANTIC/
2023-12-24 06:01:31 +00:00
SyoBoN
9b0fb0f798 Translated using Weblate (Japanese (ja_PEDANTIC))
Currently translated at 95.3% (1036 of 1086 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/ja_PEDANTIC/
2023-12-21 15:01:42 +00:00
Ekaterina Vaartis
bfdad56b0d Make the frontend config work somewhat even without DB config 2023-12-21 00:48:14 +03:00
Ekaterina Vaartis
f9c85c0c49 Initial incomplete admin emoji settings implementation 2023-12-21 00:18:02 +03:00
Pleroma Renovate Bot
89c94f97f6 Update dependency @vuelidate/validators to v2.0.4 2023-12-12 09:06:18 +00:00
Pleroma Renovate Bot
e1ef381162 Update dependency js-cookie to v3.0.5 2023-05-03 09:07:55 +00:00
Pleroma Renovate Bot
829ab46fdc Update dependency @ungap/event-target to v0.2.4 2023-04-12 09:11:09 +00:00
Sean King
8e64b1791b
Add selenium server logs path to gitignore 2023-03-30 15:30:30 -06:00
Sean King
22fd3afd16
Change selenium server path to use require instead of hardcoding it 2023-03-30 15:30:03 -06:00
Brian Underwood
0dd343f2d4 Specs for the gallery component 2023-02-08 20:50:42 +01:00
331 changed files with 13902 additions and 4095 deletions

7
.browserslistrc Normal file
View file

@ -0,0 +1,7 @@
>0.2%
not op_mini all
Safari > 15
Firefox >= 115
Firefox ESR
Android > 4
not dead

1
.gitignore vendored
View file

@ -8,3 +8,4 @@ selenium-debug.log
.idea/
config/local.json
static/emoji.json
logs/

View file

@ -43,6 +43,9 @@ lint:
test:
stage: test
tags:
- amd64
- himem
variables:
APT_CACHE_DIR: apt-cache
script:
@ -54,6 +57,9 @@ test:
build:
stage: build
tags:
- amd64
- himem
script:
- yarn
- npm run build

View file

@ -3,6 +3,74 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
## 2.7.1
Bugfix release. Added small optimizations to emoji picker that should make it a bit more responsive, however it needs rather large change to make it more performant which might come in a major release.
### Fixed
- Instance default theme not respected
- Nested panel header having wrong sticky position if navbar height != panel header height
- Toggled buttons having bad contrast (when using v2 theme)
### Changed
- Simplify the OAuth client_name to 'PleromaFE'
- Small optimizations to emoji picker
## 2.7.0
### Known issues
We got some reports related to emoji picker performance, this hopefully will be fixed in 2.7.1.
### Notes
This release overhauls how themes work, themes now need to be "compiled", which can cause some delay when loading for the first time and temporarily look "wrong" in some places (popups, menus, dialogs). Please do report any issues, especially if your theme looks wrong or breaks interface when loading. Also report issues if you're experiencing constant performance issues.
To admins: remember that you can update PleromaFE to recent `master` or `develop` in admin dashboard in "Front-ends" tab, scroll down to find PleromaFE box and click "Reinstall `master`" or dropdown and then "Reinstall `develop`". Currently there is no mechanism to check if there is an update or not.
### Changed
- Overhauled the way themes work, migrating to new Pleroma Interface Style Sheets system aka "Themes 3".
- Notifications are no longer sorted by "seen" status since interacting with them can change their read status and makes UI jumpy. Old behavior can be restored in settings.
- Notifications are now shown through a ServiceWorker (since mobile chrome does not allow them otherwise), it's always enabled, even if previously we only enabled it for WebPush notifications only. If you don't like websites "running" while closed, check how to disable them in your browser. Old way to show notifications will be used as a fallback but might not have all the new features.
- Reorganized Settings modal to move out visual stuff into Appearance tab
### Added
- Emoji pack management to the admin panel
- Support `status` notification type (subscriptions/bell, fixes PleromaFE on newer PleromaBE versions)
- Poll end notifications.
- Added option to not mark all notifications when closing notifications drawer on mobile, this creates a new button to mark all as seen.
- Option to always "show" notifications when using web push for better compatibility with some browsers (chrome, edge, safari)
- Option to toggle what notification types appear in native notifications, by default less important ones (likes, repeats, etc) will no longer show up in native notifications.
- Option to treat non-interactive notifications (likes, repeats et all) as seen for visual purposes (no read mark, ignored in counters, still can show in native notifications)
- Ability to resize UI (and certain components) scale independent of browser/text scale
- Ability to override certain aspects of UI style independent of theme used (UI roundness, fonts, underlay)
- Theme selector with visual previews of the theme
- Display loading and error indicator for conversation page
- Option to only show scrobbles that are recent enough
- Interacting (opening reply box etc) or simply clicking on non-interactive notifications now marks them as read. Clicking on native notifications for non-interactive ones also marks them as seen.
- Support group actors
- Focusing into a tab clears all current desktop notifications
- Ability to change size of emoji
- Ability to view APNG (Animated PNG) attachments.
- Support showing extra notifications in the notifications column
- Create a link to the URL of the scrobble when it's present
- Allow hiding custom emojis in picker.
- Ability to mute sensitive posts (ported from eintei).
- Native notifications now also have "badge" property that matches instance's favicon (visible in Android Chromium at least)
- Display public favorites on user profiles
- Display quotes count on posts and add quotes list page
- Show a dedicated registration notice page when further action is required after registering
### Fixed
- Synchronized requested notification types with backend, hopefully should fix missing notifications for polls and follow requests
- Error that appeared on mobile Chromium (and derivatives) when native notifications are allowed
- Being unable to set notification visibility for reports and follow requests
- Native notifications appearing as many times as there are open tabs. Clicking on notification will focus last focused tab.
- The expiry date indication won't be shown if the poll never expires
- Profile mentions causing a 422 error on newer PleromaBE versions.
- Color inputs are less ugly now
- Unread notifications should now properly catch up between sessions (eventually) in polling mode
- Video posters on Safari
## 2.6.1
### Fixed
- fix admin dashboard not having any feedback on frontend installation

View file

@ -1 +0,0 @@
Make Pleroma FE to also view apng (Animated PNG) attachment.

View file

@ -0,0 +1 @@
Updated shadow editor, hopefully fixed long-standing bugs, added ability to specify shadow's name.

View file

@ -0,0 +1 @@
Support bookmark folders

View file

@ -0,0 +1,9 @@
Updated our build system to support browsers:
Safari >= 15
Firefox >= 115
Android > 4
no Opera Mini support
no IE support
no "dead" (unmaintained) browsers support
This does not guarantee that browsers will or will not work.

View file

@ -1 +0,0 @@
Create a link to the URL of the scrobble when it's present

View file

@ -0,0 +1 @@
Support displaying time in absolute format

View file

@ -1 +0,0 @@
Fix native notifications appearing as many times as there are open tabs. Clicking on notification will focus last focused tab.

View file

@ -1 +0,0 @@
Support showing extra notifications in the notifications column

View file

@ -1 +0,0 @@
Focusing into a tab clears all current desktop notifications

View file

@ -1 +0,0 @@
Fixed error that appeared on mobile Chrome(ium) (and derivatives) when native notifications are allowed

View file

@ -1 +0,0 @@
Added option to not mark all notifications when closing notifications drawer on mobile, this creates a new button to mark all as seen.

View file

@ -1 +0,0 @@
Fixed being unable to set notification visibility for reports and follow requests

View file

@ -0,0 +1 @@
Fix whitespaces for multiple status mute reasons, display bot status reason

View file

@ -1 +0,0 @@
Added option to toggle what notification types appear in native notifications, by default less important ones (likes, repeats, etc) will no longer show up in native notifications.

View file

@ -1 +0,0 @@
Native notifications now also have "badge" property that matches instance's favicon (visible in Android Chromium at least)

View file

@ -0,0 +1 @@
Inform users that Smithereen public polls are public

View file

@ -1 +0,0 @@
Added option to treat non-interactive notifications (likes, repeats et all) as seen for visual purposes (no read mark, ignored in counters, still can show in native notifications)

View file

@ -1 +0,0 @@
Interacting (opening reply box etc) or simply clicking on non-interactive notifications now marks them as read. Clicking on native notifications for non-interactive ones also marks them as seen.

View file

@ -1 +0,0 @@
Notifications are no longer sorted by "seen" status since interacting with them can change their read status and makes UI jumpy. Old behavior can be restored in settings.

View file

@ -0,0 +1 @@
Simplify the OAuth client_name to 'PleromaFE'

View file

View file

View file

@ -1 +0,0 @@
Notifications are now shown through a serviceworker (since mobile chrome does not allow them otherwise), it's always enabled, even if previously we only enabled it for WebPush notifications only. If you don't like websites "running" while closed, check how to disable them in your browser. Old way to show notifications will be used as a fallback but might not have all the new features.

View file

@ -1 +0,0 @@
Shows the most recent scrobble under each post when available

View file

@ -0,0 +1 @@
Splash screen + loading indicator to make process of identifying initialization issues and load performance

View file

@ -1 +0,0 @@
unread notifications should now properly catch up (eventually) in polling mode

View file

@ -1 +0,0 @@
Video posters on Safari

View file

@ -1 +0,0 @@
Added option to always "show" notifications when using web push for better compatibility with some browsers (chrome, edge, safari)

View file

@ -4,11 +4,138 @@
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1,user-scalable=no">
<link rel="icon" type="image/png" href="/favicon.png">
<!-- putting styles here to avoid having to wait for styles to load up -->
<style id="splashscreen">
#splash {
--scale: 1;
width: 100vw;
height: 100vh;
display: grid;
grid-template-rows: auto;
grid-template-columns: auto;
align-content: center;
align-items: center;
justify-content: center;
justify-items: center;
flex-direction: column;
background: #0f161e;
font-family: sans-serif;
color: #b9b9ba;
position: absolute;
z-index: 9999;
font-size: calc(1vw + 1vh + 1vmin);
}
#splash-credit {
position: absolute;
font-size: 14px;
bottom: 16px;
right: 16px;
}
#splash-container {
align-items: center;
}
#mascot-container {
display: flex;
align-items: flex-end;
justify-content: center;
perspective: 60em;
perspective-origin: 0 -15em;
transform-style: preserve-3d;
}
#mascot {
width: calc(10em * var(--scale));
height: calc(10em * var(--scale));
object-fit: contain;
object-position: bottom;
transform: translateZ(-2em);
}
#throbber {
display: grid;
width: calc(5em * 0.5 * var(--scale));
height: calc(8em * 0.5 * var(--scale));
margin-left: 4.1em;
z-index: 2;
grid-template-rows: repeat(8, 1fr);
grid-template-columns: repeat(5, 1fr);
grid-template-areas: "P P . L L"
"P P . L L"
"P P . L L"
"P P . L L"
"P P . . ."
"P P . . ."
"P P . E E"
"P P . E E";
}
.chunk {
background-color: #e2b188;
box-shadow: 0.01em 0.01em 0.1em 0 #e2b188;
}
#chunk-P {
grid-area: P;
border-top-left-radius: calc(var(--logoChunkSize) / 2);
}
#chunk-L {
grid-area: L;
border-bottom-right-radius: calc(var(--logoChunkSize) / 2);
}
#chunk-E {
grid-area: E;
border-bottom-right-radius: calc(var(--logoChunkSize) / 2);
}
#status {
margin-top: 1em;
line-height: 2;
width: 100%;
text-align: center;
}
@media (prefers-reduced-motion) {
#throbber {
animation: none !important;
}
}
</style>
<style id="pleroma-eager-styles" type="text/css"></style>
<style id="pleroma-lazy-styles" type="text/css"></style>
<!--server-generated-meta-->
</head>
<body class="hidden">
<body style="margin: 0; padding: 0">
<noscript>To use Pleroma, please enable JavaScript.</noscript>
<div id="app"></div>
<div id="splash">
<!-- we are hiding entire graphic so no point showing credit -->
<div aria-hidden="true" id="splash-credit">
Art by pipivovott
</div>
<div id="splash-container">
<div aria-hidden="true" id="mascot-container">
<div id="throbber">
<div class="chunk" id="chunk-P">
</div>
<div class="chunk" id="chunk-L">
</div>
<div class="chunk" id="chunk-E">
</div>
</div>
<img id="mascot" src="/static/pleromatan_apology.png">
</div>
<div id="status" class="css-ok">
<!-- (。><) -->
<!-- it's a pseudographic, don't want screenreader read out nonsense -->
<span aria-hidden="true" class="initial-text">(。&gt;&lt;)</span>
</div>
</div>
</div>
<div id="app" class="hidden"></div>
<div id="modal"></div>
<!-- built files will be auto injected -->
<div id="popovers" />

View file

@ -1,6 +1,6 @@
{
"name": "pleroma_fe",
"version": "2.6.1",
"version": "2.7.1",
"description": "Pleroma frontend, the default frontend of Pleroma social network server",
"author": "Pleroma contributors <https://git.pleroma.social/pleroma/pleroma-fe/-/blob/develop/CONTRIBUTORS.md>",
"private": false,
@ -24,15 +24,16 @@
"@fortawesome/vue-fontawesome": "3.0.3",
"@kazvmoe-infra/pinch-zoom-element": "1.2.0",
"@kazvmoe-infra/unicode-emoji-json": "0.4.0",
"@ruffle-rs/ruffle": "0.1.0-nightly.2022.7.12",
"@ruffle-rs/ruffle": "0.1.0-nightly.2024.8.21",
"@vuelidate/core": "2.0.3",
"@vuelidate/validators": "2.0.0",
"@vuelidate/validators": "2.0.4",
"body-scroll-lock": "3.1.5",
"chromatism": "3.0.0",
"click-outside-vue3": "4.0.1",
"cropperjs": "1.5.13",
"escape-html": "1.0.3",
"js-cookie": "3.0.1",
"hash-sum": "^2.0.0",
"js-cookie": "3.0.5",
"localforage": "1.10.0",
"parse-link-header": "2.0.0",
"phoenix": "1.7.7",
@ -55,13 +56,13 @@
"@babel/preset-env": "7.21.5",
"@babel/register": "7.21.0",
"@intlify/vue-i18n-loader": "5.0.1",
"@ungap/event-target": "0.2.3",
"@ungap/event-target": "0.2.4",
"@vue/babel-helper-vue-jsx-merge-props": "1.4.0",
"@vue/babel-plugin-jsx": "1.1.1",
"@vue/babel-plugin-jsx": "1.2.2",
"@vue/compiler-sfc": "3.2.45",
"@vue/test-utils": "2.2.8",
"autoprefixer": "10.4.14",
"babel-loader": "9.1.2",
"autoprefixer": "10.4.19",
"babel-loader": "9.1.3",
"babel-plugin-lodash": "3.3.4",
"chai": "4.3.7",
"chalk": "1.1.3",
@ -69,7 +70,7 @@
"connect-history-api-fallback": "2.0.0",
"copy-webpack-plugin": "11.0.0",
"cross-spawn": "7.0.3",
"css-loader": "6.7.3",
"css-loader": "6.10.0",
"css-minimizer-webpack-plugin": "4.2.2",
"custom-event-polyfill": "1.0.7",
"eslint": "8.33.0",
@ -87,9 +88,9 @@
"http-proxy-middleware": "2.0.6",
"iso-639-1": "2.1.15",
"json-loader": "0.5.7",
"karma": "6.4.2",
"karma": "6.4.4",
"karma-coverage": "2.2.0",
"karma-firefox-launcher": "2.1.2",
"karma-firefox-launcher": "2.1.3",
"karma-mocha": "2.0.1",
"karma-mocha-reporter": "2.2.5",
"karma-sinon-chai": "2.0.2",
@ -99,7 +100,7 @@
"lodash": "4.17.21",
"mini-css-extract-plugin": "2.7.6",
"mocha": "10.2.0",
"nightwatch": "2.6.20",
"nightwatch": "2.6.25",
"opn": "5.5.0",
"ora": "0.4.1",
"postcss": "8.4.23",
@ -131,5 +132,6 @@
"engines": {
"node": ">= 16.0.0",
"npm": ">= 3.0.0"
}
},
"packageManager": "yarn@1.22.22+sha512.a6b2f7906b721bba3d67d4aff083df04dad64c399707841b7acf00f6b133b7ac24255f2652fa22ae3534329dc6180534e98d17432037ff6fd140556e2bb3137e"
}

0
preview.style.js Normal file
View file

View file

@ -44,16 +44,29 @@ export default {
data: () => ({
mobileActivePanel: 'timeline'
}),
watch: {
themeApplied (value) {
this.removeSplash()
}
},
created () {
// Load the locale from the storage
const val = this.$store.getters.mergedConfig.interfaceLanguage
this.$store.dispatch('setOption', { name: 'interfaceLanguage', value: val })
window.addEventListener('resize', this.updateMobileState)
},
mounted () {
if (this.$store.state.interface.themeApplied) {
this.removeSplash()
}
},
unmounted () {
window.removeEventListener('resize', this.updateMobileState)
},
computed: {
themeApplied () {
return this.$store.state.interface.themeApplied
},
classes () {
return [
{
@ -130,6 +143,15 @@ export default {
updateMobileState () {
this.$store.dispatch('setLayoutWidth', windowWidth())
this.$store.dispatch('setLayoutHeight', windowHeight())
},
removeSplash () {
document.querySelector('#status').textContent = this.$t('splash.fun_' + Math.ceil(Math.random() * 4))
const splashscreenRoot = document.querySelector('#splash')
splashscreenRoot.addEventListener('transitionend', () => {
splashscreenRoot.remove()
})
splashscreenRoot.classList.add('hidden')
document.querySelector('#app').classList.remove('hidden')
}
}
}

View file

@ -1,10 +1,9 @@
// stylelint-disable rscss/class-format
/* stylelint-disable no-descending-specificity */
@import "./variables";
@import "./panel";
:root {
--navbar-height: 3.5rem;
--status-margin: 0.75em;
--post-line-height: 1.4;
// Z-Index stuff
--ZI_media_modal: 9000;
@ -13,19 +12,25 @@
--ZI_navbar_popovers: 7500;
--ZI_navbar: 7000;
--ZI_popovers: 6000;
// Fallback for when stuff is loading
--background: var(--bg);
}
html {
font-size: 14px;
font-size: var(--textSize, 14px);
--navbar-height: var(--navbarSize, 3.5rem);
--emoji-size: var(--emojiSize, 32px);
--panel-header-height: var(--panelHeaderSize, 3.2rem);
// overflow-x: clip causes my browser's tab to crash with SIGILL lul
}
body {
font-family: sans-serif;
font-family: var(--interfaceFont, sans-serif);
font-family: var(--font);
margin: 0;
color: $fallback--text;
color: var(--text, $fallback--text);
color: var(--text);
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
overscroll-behavior-y: none;
@ -42,17 +47,35 @@ body {
// have a cursor/pointer to operate them
@media (any-pointer: fine) {
* {
scrollbar-color: var(--btn) transparent;
scrollbar-color: var(--fg) transparent;
&::-webkit-scrollbar {
background: transparent;
}
&::-webkit-scrollbar-corner {
background: transparent;
}
&::-webkit-resizer {
/* stylelint-disable-next-line declaration-no-important */
background-color: transparent !important;
background-image:
linear-gradient(
135deg,
transparent calc(50% - 1px),
var(--textFaint) 50%,
transparent calc(50% + 1px),
transparent calc(75% - 1px),
var(--textFaint) 75%,
transparent calc(75% + 1px),
);
}
&::-webkit-scrollbar-button,
&::-webkit-scrollbar-thumb {
background-color: var(--btn);
box-shadow: var(--buttonShadow);
border-radius: var(--btnRadius);
box-shadow: var(--shadow);
border-radius: var(--roundness);
}
// horizontal/vertical/increment/decrement are webkit-specific stuff
@ -61,7 +84,7 @@ body {
&::-webkit-scrollbar-button {
--___bgPadding: 2px;
color: var(--btnText);
color: var(--text);
background-repeat: no-repeat, no-repeat;
&:horizontal {
@ -69,15 +92,15 @@ body {
&:increment {
background-image:
linear-gradient(45deg, var(--btnText) 50%, transparent 51%),
linear-gradient(-45deg, transparent 50%, var(--btnText) 51%);
linear-gradient(45deg, var(--text) 50%, transparent 51%),
linear-gradient(-45deg, transparent 50%, var(--text) 51%);
background-position: top var(--___bgPadding) left 50%, right 50% bottom var(--___bgPadding);
}
&:decrement {
background-image:
linear-gradient(45deg, transparent 50%, var(--btnText) 51%),
linear-gradient(-45deg, var(--btnText) 50%, transparent 51%);
linear-gradient(45deg, transparent 50%, var(--text) calc(50% + 1px)),
linear-gradient(-45deg, var(--text) 50%, transparent 51%);
background-position: bottom var(--___bgPadding) right 50%, left 50% top var(--___bgPadding);
}
}
@ -87,15 +110,15 @@ body {
&:increment {
background-image:
linear-gradient(-45deg, transparent 50%, var(--btnText) 51%),
linear-gradient(45deg, transparent 50%, var(--btnText) 51%);
linear-gradient(-45deg, transparent 50%, var(--text) 51%),
linear-gradient(45deg, transparent 50%, var(--text) 51%);
background-position: right var(--___bgPadding) top 50%, left var(--___bgPadding) top 50%;
}
&:decrement {
background-image:
linear-gradient(-45deg, var(--btnText) 50%, transparent 51%),
linear-gradient(45deg, var(--btnText) 50%, transparent 51%);
linear-gradient(-45deg, var(--text) 50%, transparent 51%),
linear-gradient(45deg, var(--text) 50%, transparent 51%);
background-position: left var(--___bgPadding) top 50%, right var(--___bgPadding) top 50%;
}
}
@ -104,15 +127,14 @@ body {
}
// Body should have background to scrollbar otherwise it will use white (body color?)
html {
scrollbar-color: var(--selectedMenu) var(--wallpaper);
scrollbar-color: var(--fg) var(--wallpaper);
background: var(--wallpaper);
}
}
a {
text-decoration: none;
color: $fallback--link;
color: var(--link, $fallback--link);
color: var(--link);
}
h4 {
@ -128,29 +150,15 @@ h4 {
i[class*="icon-"],
.svg-inline--fa,
.iconLetter {
color: $fallback--icon;
color: var(--icon, $fallback--icon);
}
.button-unstyled:hover,
a:hover {
> i[class*="icon-"],
> .svg-inline--fa,
> .iconLetter {
color: var(--text);
}
color: var(--icon);
}
nav {
z-index: var(--ZI_navbar);
background-color: $fallback--fg;
background-color: var(--topBar, $fallback--fg);
color: $fallback--faint;
color: var(--faint, $fallback--faint);
box-shadow: 0 0 4px rgb(0 0 0 / 60%);
box-shadow: var(--topBarShadow);
box-shadow: var(--shadow);
box-sizing: border-box;
height: var(--navbar-height);
font-size: calc(var(--navbar-height) / 3.5);
position: fixed;
}
@ -195,16 +203,14 @@ nav {
grid-column: 1 / span 3;
grid-row: 1 / 1;
pointer-events: none;
background-color: rgb(0 0 0 / 15%);
background-color: var(--underlay, rgb(0 0 0 / 15%));
background-color: var(--underlay);
z-index: -1000;
}
.app-layout {
--miniColumn: 25rem;
--maxiColumn: 45rem;
--columnGap: 1em;
--status-margin: 0.75em;
--columnGap: 1rem;
--effectiveSidebarColumnWidth: minmax(var(--miniColumn), var(--sidebarColumnWidth, var(--miniColumn)));
--effectiveNotifsColumnWidth: minmax(var(--miniColumn), var(--notifsColumnWidth, var(--miniColumn)));
--effectiveContentColumnWidth: minmax(var(--miniColumn), var(--contentColumnWidth, var(--maxiColumn)));
@ -366,106 +372,112 @@ nav {
.button-default {
user-select: none;
color: $fallback--text;
color: var(--btnText, $fallback--text);
background-color: $fallback--fg;
background-color: var(--btn, $fallback--fg);
color: var(--text);
border: none;
border-radius: $fallback--btnRadius;
border-radius: var(--btnRadius, $fallback--btnRadius);
cursor: pointer;
box-shadow: $fallback--buttonShadow;
box-shadow: var(--buttonShadow);
background-color: var(--background);
box-shadow: var(--shadow);
font-size: 1em;
font-family: sans-serif;
font-family: var(--interfaceFont, sans-serif);
&.-sublime {
background: transparent;
}
i[class*="icon-"],
.svg-inline--fa {
color: $fallback--text;
color: var(--btnText, $fallback--text);
}
font-family: var(--font);
&::-moz-focus-inner {
border: none;
}
&:hover {
box-shadow: 0 0 4px rgb(255 255 255 / 30%);
box-shadow: var(--buttonHoverShadow);
}
&:active {
box-shadow:
0 0 4px 0 rgb(255 255 255 / 30%),
0 1px 0 0 rgb(0 0 0 / 20%) inset,
0 -1px 0 0 rgb(255 255 255 / 20%) inset;
box-shadow: var(--buttonPressedShadow);
color: $fallback--text;
color: var(--btnPressedText, $fallback--text);
background-color: $fallback--fg;
background-color: var(--btnPressed, $fallback--fg);
svg,
i {
color: $fallback--text;
color: var(--btnPressedText, $fallback--text);
}
}
&:disabled {
cursor: not-allowed;
color: $fallback--text;
color: var(--btnDisabledText, $fallback--text);
background-color: $fallback--fg;
background-color: var(--btnDisabled, $fallback--fg);
}
}
svg,
i {
color: $fallback--text;
color: var(--btnDisabledText, $fallback--text);
}
.menu-item,
.list-item {
display: block;
box-sizing: border-box;
border: none;
outline: none;
text-align: initial;
font-size: inherit;
font-family: inherit;
font-weight: 400;
cursor: pointer;
color: inherit;
clear: both;
position: relative;
white-space: nowrap;
border-color: var(--border);
border-style: solid;
border-width: 0;
border-top-width: 1px;
width: 100%;
line-height: var(--__line-height);
padding: var(--__vertical-gap) var(--__horizontal-gap);
background: transparent;
--__line-height: 1.5em;
--__horizontal-gap: 0.75em;
--__vertical-gap: 0.5em;
&.-non-interactive {
cursor: auto;
}
&.toggled {
color: $fallback--text;
color: var(--btnToggledText, $fallback--text);
background-color: $fallback--fg;
background-color: var(--btnToggled, $fallback--fg);
box-shadow:
0 0 4px 0 rgb(255 255 255 / 30%),
0 1px 0 0 rgb(0 0 0 / 20%) inset,
0 -1px 0 0 rgb(255 255 255 / 20%) inset;
box-shadow: var(--buttonPressedShadow);
svg,
i {
color: $fallback--text;
color: var(--btnToggledText, $fallback--text);
}
&.-active,
&:hover {
border-top-width: 1px;
border-bottom-width: 1px;
}
&.danger {
// TODO: add better color variable
color: $fallback--text;
color: var(--alertErrorPanelText, $fallback--text);
background-color: $fallback--alertError;
background-color: var(--alertError, $fallback--alertError);
&.-active + &,
&:hover + & {
border-top-width: 0;
}
&:hover + .menu-item-collapsible:not(.-expanded) + &,
&.-active + .menu-item-collapsible:not(.-expanded) + & {
border-top-width: 0;
}
&[aria-expanded="true"] {
border-bottom-width: 1px;
}
a,
button:not(.button-default) {
text-align: initial;
padding: 0;
background: none;
border: none;
outline: none;
display: inline;
font-size: 100%;
font-family: inherit;
line-height: unset;
color: var(--text);
}
&:first-child {
border-top-right-radius: var(--roundness);
border-top-left-radius: var(--roundness);
border-top-width: 0;
}
&:last-child {
border-bottom-right-radius: var(--roundness);
border-bottom-left-radius: var(--roundness);
border-bottom-width: 0;
}
}
.button-unstyled {
background: none;
border: none;
outline: none;
display: inline;
text-align: initial;
font-size: 100%;
font-family: inherit;
box-shadow: var(--shadow);
background-color: transparent;
padding: 0;
line-height: unset;
cursor: pointer;
@ -473,28 +485,23 @@ nav {
color: inherit;
&.-link {
color: $fallback--link;
color: var(--link, $fallback--link);
}
&.-fullwidth {
width: 100%;
}
&.-hover-highlight {
&:hover svg {
color: $fallback--lightText;
color: var(--lightText, $fallback--lightText);
}
/* stylelint-disable-next-line declaration-no-important */
color: var(--link) !important;
}
}
input,
textarea,
textarea {
border: none;
display: inline-block;
outline: none;
}
.input {
&.unstyled {
border-radius: 0;
background: none;
/* stylelint-disable-next-line declaration-no-important */
background: none !important;
box-shadow: none;
height: unset;
}
@ -502,19 +509,10 @@ textarea,
--_padding: 0.5em;
border: none;
border-radius: $fallback--inputRadius;
border-radius: var(--inputRadius, $fallback--inputRadius);
box-shadow:
0 1px 0 0 rgb(0 0 0 / 20%) inset,
0 -1px 0 0 rgb(255 255 255 / 20%) inset,
0 0 2px 0 rgb(0 0 0 / 100%) inset;
box-shadow: var(--inputShadow);
background-color: $fallback--fg;
background-color: var(--input, $fallback--fg);
color: $fallback--lightText;
color: var(--inputText, $fallback--lightText);
font-family: sans-serif;
font-family: var(--inputFont, sans-serif);
background-color: var(--background);
color: var(--text);
box-shadow: var(--shadow);
font-family: var(--font);
font-size: 1em;
margin: 0;
box-sizing: border-box;
@ -528,7 +526,6 @@ textarea,
&[disabled="disabled"],
&.disabled {
cursor: not-allowed;
opacity: 0.5;
}
&[type="range"] {
@ -543,9 +540,9 @@ textarea,
display: none;
&:checked + label::before {
box-shadow: 0 0 2px black inset, 0 0 0 4px $fallback--fg inset;
box-shadow: var(--inputShadow), 0 0 0 4px var(--fg, $fallback--fg) inset;
background-color: var(--accent, $fallback--link);
box-shadow: var(--shadow);
background-color: var(--background);
color: var(--text);
}
&:disabled {
@ -559,16 +556,14 @@ textarea,
+ label::before {
flex-shrink: 0;
display: inline-block;
content: "";
content: "";
transition: box-shadow 200ms;
width: 1.1em;
height: 1.1em;
border-radius: 100%; // Radio buttons should always be circle
box-shadow: 0 0 2px black inset;
box-shadow: var(--inputShadow);
background-color: var(--background);
box-shadow: var(--shadow);
margin-right: 0.5em;
background-color: $fallback--fg;
background-color: var(--input, $fallback--fg);
vertical-align: top;
text-align: center;
line-height: 1.1;
@ -581,8 +576,9 @@ textarea,
&[type="checkbox"] {
&:checked + label::before {
color: $fallback--text;
color: var(--inputText, $fallback--text);
color: var(--text);
background-color: var(--background);
box-shadow: var(--shadow);
}
&:disabled {
@ -600,13 +596,9 @@ textarea,
transition: color 200ms;
width: 1.1em;
height: 1.1em;
border-radius: $fallback--checkboxRadius;
border-radius: var(--checkboxRadius, $fallback--checkboxRadius);
box-shadow: 0 0 2px black inset;
box-shadow: var(--inputShadow);
border-radius: var(--roundness);
box-shadow: var(--shadow);
margin-right: 0.5em;
background-color: $fallback--fg;
background-color: var(--input, $fallback--fg);
vertical-align: top;
text-align: center;
line-height: 1.1;
@ -622,17 +614,26 @@ textarea,
}
}
.input,
.button-default {
--_roundness-left: var(--roundness);
--_roundness-right: var(--roundness);
border-top-left-radius: var(--_roundness-left);
border-bottom-left-radius: var(--_roundness-left);
border-top-right-radius: var(--_roundness-right);
border-bottom-right-radius: var(--_roundness-right);
}
// Textareas should have stock line-height + vertical padding instead of huge line-height
textarea {
textarea.input {
padding: var(--_padding);
line-height: var(--post-line-height);
}
option {
color: $fallback--text;
color: var(--text, $fallback--text);
background-color: $fallback--bg;
background-color: var(--bg, $fallback--bg);
color: var(--text);
background-color: var(--background);
}
.hide-number-spinner {
@ -653,7 +654,7 @@ option {
li {
border: 1px solid var(--border);
border-radius: var(--inputRadius);
border-radius: var(--roundness);
padding: 0.5em;
margin: 0.25em;
}
@ -669,22 +670,23 @@ option {
display: inline-flex;
vertical-align: middle;
button,
.button-dropdown {
> *,
> * .button-default {
--_roundness-left: 0;
--_roundness-right: 0;
position: relative;
flex: 1 1 auto;
}
&:not(:last-child),
&:not(:last-child) .button-default {
border-top-right-radius: 0;
border-bottom-right-radius: 0;
}
> *:first-child,
> *:first-child .button-default {
--_roundness-left: var(--roundness);
}
&:not(:first-child),
&:not(:first-child) .button-default {
border-top-left-radius: 0;
border-bottom-left-radius: 0;
}
> *:last-child,
> *:last-child .button-default {
--_roundness-right: var(--roundness);
}
}
@ -714,74 +716,58 @@ option {
overflow: hidden;
text-overflow: ellipsis;
&.badge-notification {
background-color: $fallback--cRed;
background-color: var(--badgeNotification, $fallback--cRed);
color: white;
color: var(--badgeNotificationText, white);
&.-dot,
&.-counter {
margin: 0;
position: absolute;
}
&.-dot {
min-height: 8px;
max-height: 8px;
min-width: 8px;
max-width: 8px;
padding: 0;
line-height: 0;
font-size: 0;
left: calc(50% - 4px);
top: calc(50% - 4px);
margin-left: 6px;
margin-top: -6px;
}
&.-counter {
border-radius: var(--roundness);
font-size: 0.75em;
line-height: 1;
text-align: right;
padding: 0.2em;
min-width: 0;
left: calc(50% - 0.5em);
top: calc(50% - 0.4em);
margin-left: 0.7em;
margin-top: -1em;
}
}
.alert {
margin: 0 0.35em;
padding: 0 0.25em;
border-radius: $fallback--tooltipRadius;
border-radius: var(--tooltipRadius, $fallback--tooltipRadius);
&.error {
background-color: $fallback--alertError;
background-color: var(--alertError, $fallback--alertError);
color: $fallback--text;
color: var(--alertErrorText, $fallback--text);
.panel-heading & {
color: $fallback--text;
color: var(--alertErrorPanelText, $fallback--text);
}
}
&.warning {
background-color: $fallback--alertWarning;
background-color: var(--alertWarning, $fallback--alertWarning);
color: $fallback--text;
color: var(--alertWarningText, $fallback--text);
.panel-heading & {
color: $fallback--text;
color: var(--alertWarningPanelText, $fallback--text);
}
}
&.success {
background-color: var(--alertSuccess, $fallback--alertWarning);
color: var(--alertSuccessText, $fallback--text);
.panel-heading & {
color: var(--alertSuccessPanelText, $fallback--text);
}
}
border-radius: var(--roundness);
border: 1px solid var(--border);
}
.faint {
color: $fallback--faint;
color: var(--faint, $fallback--faint);
}
--text: var(--textFaint);
--link: var(--linkFaint);
.faint-link {
color: $fallback--faint;
color: var(--faint, $fallback--faint);
&:hover {
text-decoration: underline;
}
color: var(--text);
}
.visibility-notice {
padding: 0.5em;
border: 1px solid $fallback--faint;
border: 1px solid var(--faint, $fallback--faint);
border-radius: $fallback--inputRadius;
border-radius: var(--inputRadius, $fallback--inputRadius);
border: 1px solid var(--textFaint);
border-radius: var(--roundness);
}
.notice-dismissible {
@ -802,6 +788,10 @@ option {
&.iconLetter {
font-size: 1.1em;
}
&.svg-inline--fa {
vertical-align: -0.15em;
}
}
.fa-old-padding {
@ -816,6 +806,11 @@ option {
opacity: 0.25;
}
.timeago {
--link: var(--text);
--linkFaint: var(--textFaint);
}
.login-hint {
text-align: center;
@ -914,3 +909,174 @@ option {
padding: 0;
position: absolute;
}
*::selection {
color: var(--selectionText);
background-color: var(--selectionBackground);
}
#splash {
pointer-events: none;
transition: opacity 2s;
opacity: 1;
&.hidden {
opacity: 0;
}
#status {
&.css-ok {
&::before {
display: inline-block;
content: "CSS OK";
}
}
.initial-text {
display: none;
}
}
#throbber {
animation-duration: 3s;
animation-name: bounce;
animation-iteration-count: infinite;
animation-direction: normal;
transform-origin: bottom center;
&.dead {
animation-name: dead;
animation-duration: 2s;
animation-iteration-count: 1;
transform: rotateX(90deg) rotateY(0) rotateZ(-45deg);
}
@keyframes dead {
0% {
transform: rotateX(0) rotateY(0) rotateZ(0);
}
5% {
transform: rotateX(0) rotateY(0) rotateZ(1deg);
}
10% {
transform: rotateX(0) rotateY(0) rotateZ(-2deg);
}
15% {
transform: rotateX(0) rotateY(0) rotateZ(3deg);
}
20% {
transform: rotateX(0) rotateY(0) rotateZ(0);
}
25% {
transform: rotateX(0) rotateY(0) rotateZ(0);
}
30% {
transform: rotateX(10deg) rotateY(0) rotateZ(0);
}
35% {
transform: rotateX(-10deg) rotateY(0) rotateZ(0);
}
40% {
transform: rotateX(10deg) rotateY(0) rotateZ(0);
}
45% {
transform: rotateX(-10deg) rotateY(0) rotateZ(0);
}
50% {
transform: rotateX(10deg) rotateY(0) rotateZ(0);
}
100% {
transform: rotateX(90deg) rotateY(0) rotateZ(-45deg);
transition-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06); /* easeInQuint */
}
}
@keyframes bounce {
0% {
scale: 1 1;
translate: 0 0;
animation-timing-function: ease-out;
}
10% {
scale: 1.2 0.8;
translate: 0 0;
transform: rotateZ(var(--defaultZ));
animation-timing-function: ease-out;
}
30% {
scale: 0.9 1.1;
translate: 0 -40%;
transform: rotateZ(var(--defaultZ));
animation-timing-function: ease-in;
}
40% {
scale: 1.1 0.9;
translate: 0 -50%;
transform: rotateZ(var(--defaultZ));
animation-timing-function: ease-in;
}
45% {
scale: 0.9 1.1;
translate: 0 -45%;
transform: rotateZ(var(--defaultZ));
animation-timing-function: ease-in;
}
50% {
scale: 1.05 0.95;
translate: 0 -40%;
animation-timing-function: ease-in;
}
55% {
scale: 0.985 1.025;
translate: 0 -35%;
transform: rotateZ(var(--defaultZ));
animation-timing-function: ease-in;
}
60% {
scale: 1.0125 0.9985;
translate: 0 -30%;
transform: rotateZ(var(--defaultZ));
animation-timing-function: ease-in;
}
80% {
scale: 1.0063 0.9938;
translate: 0 -10%;
transform: rotateZ(var(--defaultZ));
animation-timing-function: ease-in-ou;
}
90% {
scale: 1.2 0.8;
translate: 0 0;
transform: rotateZ(var(--defaultZ));
animation-timing-function: ease-out;
}
100% {
scale: 1 1;
translate: 0 0;
transform: rotateZ(var(--defaultZ));
animation-timing-function: ease-out;
}
}
}
}

View file

@ -1,5 +1,6 @@
<template>
<div
v-show="$store.state.interface.themeApplied"
id="app-loaded"
:style="bgStyle"
>

View file

@ -1,36 +0,0 @@
$main-color: #f58d2c;
$main-background: white;
$darkened-background: whitesmoke;
$fallback--bg: #121a24;
$fallback--fg: #182230;
$fallback--faint: rgb(185 185 186 / 50%);
$fallback--text: #b9b9ba;
$fallback--link: #d8a070;
$fallback--icon: #666;
$fallback--lightBg: rgb(21 30 42);
$fallback--lightText: #b9b9ba;
$fallback--border: #222;
$fallback--cRed: #f00;
$fallback--cBlue: #0095ff;
$fallback--cGreen: #0fa00f;
$fallback--cOrange: orange;
$fallback--alertError: rgb(211 16 20 / 50%);
$fallback--alertWarning: rgb(111 111 20 / 50%);
$fallback--panelRadius: 10px;
$fallback--checkboxRadius: 2px;
$fallback--btnRadius: 4px;
$fallback--inputRadius: 4px;
$fallback--tooltipRadius: 5px;
$fallback--avatarRadius: 4px;
$fallback--avatarAltRadius: 10px;
$fallback--attachmentRadius: 10px;
$fallback--chatMessageRadius: 10px;
$fallback--buttonShadow: 0 0 2px 0 rgb(0 0 0 / 100%),
0 1px 0 0 rgb(255 255 255 / 20%) inset,
0 -1px 0 0 rgb(0 0 0 / 20%) inset;
$status-margin: 0.75em;

Binary file not shown.

Before

Width:  |  Height:  |  Size: 396 KiB

After

Width:  |  Height:  |  Size: 35 B

Before After
Before After

View file

@ -0,0 +1 @@
../../static/pleromatan_apology.png

Before

Width:  |  Height:  |  Size: 396 KiB

After

Width:  |  Height:  |  Size: 35 B

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 521 KiB

After

Width:  |  Height:  |  Size: 39 B

Before After
Before After

View file

@ -0,0 +1 @@
../../static/pleromatan_apology_fox.png

Before

Width:  |  Height:  |  Size: 521 KiB

After

Width:  |  Height:  |  Size: 39 B

Before After
Before After

View file

@ -13,8 +13,7 @@ import VBodyScrollLock from 'src/directives/body_scroll_lock'
import { windowWidth, windowHeight } from '../services/window_utils/window_utils'
import { getOrCreateApp, getClientToken } from '../services/new_api/oauth.js'
import backendInteractorService from '../services/backend_interactor_service/backend_interactor_service.js'
import { CURRENT_VERSION } from '../services/theme_data/theme_data.service.js'
import { applyTheme, applyConfig } from '../services/style_setter/style_setter.js'
import { applyConfig } from '../services/style_setter/style_setter.js'
import FaviconService from '../services/favicon_service/favicon_service.js'
import { initServiceWorker, updateFocus } from '../services/sw/sw.js'
@ -123,6 +122,7 @@ const setSettings = async ({ apiConfig, staticConfig, store }) => {
store.dispatch('setInstanceOption', { name, value: config[name] })
}
copyInstanceOption('theme')
copyInstanceOption('nsfwCensorImage')
copyInstanceOption('background')
copyInstanceOption('hidePostStats')
@ -160,8 +160,6 @@ const setSettings = async ({ apiConfig, staticConfig, store }) => {
copyInstanceOption('showFeaturesPanel')
copyInstanceOption('hideSitename')
copyInstanceOption('sidebarRight')
return store.dispatch('setTheme', config.theme)
}
const getTOS = async ({ store }) => {
@ -255,12 +253,14 @@ const getNodeInfo = async ({ store }) => {
store.dispatch('setInstanceOption', { name: 'shoutAvailable', value: features.includes('chat') })
store.dispatch('setInstanceOption', { name: 'pleromaChatMessagesAvailable', value: features.includes('pleroma_chat_messages') })
store.dispatch('setInstanceOption', { name: 'pleromaCustomEmojiReactionsAvailable', value: features.includes('pleroma_custom_emoji_reactions') })
store.dispatch('setInstanceOption', { name: 'pleromaBookmarkFoldersAvailable', value: features.includes('pleroma:bookmark_folders') })
store.dispatch('setInstanceOption', { name: 'gopherAvailable', value: features.includes('gopher') })
store.dispatch('setInstanceOption', { name: 'pollsAvailable', value: features.includes('polls') })
store.dispatch('setInstanceOption', { name: 'editingAvailable', value: features.includes('editing') })
store.dispatch('setInstanceOption', { name: 'pollLimits', value: metadata.pollLimits })
store.dispatch('setInstanceOption', { name: 'mailerEnabled', value: metadata.mailerEnabled })
store.dispatch('setInstanceOption', { name: 'quotingAvailable', value: features.includes('quote_posting') })
store.dispatch('setInstanceOption', { name: 'groupActorAvailable', value: features.includes('pleroma:group_actors') })
const uploadLimits = metadata.uploadLimits
store.dispatch('setInstanceOption', { name: 'uploadlimit', value: parseInt(uploadLimits.general) })
@ -327,17 +327,10 @@ const setConfig = async ({ store }) => {
}
const checkOAuthToken = async ({ store }) => {
// eslint-disable-next-line no-async-promise-executor
return new Promise(async (resolve, reject) => {
if (store.getters.getUserToken()) {
try {
await store.dispatch('loginUser', store.getters.getUserToken())
} catch (e) {
console.error(e)
}
}
resolve()
})
if (store.getters.getUserToken()) {
return store.dispatch('loginUser', store.getters.getUserToken())
}
return Promise.resolve()
}
const afterStoreSetup = async ({ store, i18n }) => {
@ -353,34 +346,26 @@ const afterStoreSetup = async ({ store, i18n }) => {
const server = (typeof overrides.target !== 'undefined') ? overrides.target : window.location.origin
store.dispatch('setInstanceOption', { name: 'server', value: server })
document.querySelector('#status').textContent = i18n.global.t('splash.settings')
await setConfig({ store })
const { customTheme, customThemeSource } = store.state.config
const { theme } = store.state.instance
const customThemePresent = customThemeSource || customTheme
if (customThemePresent) {
if (customThemeSource && customThemeSource.themeEngineVersion === CURRENT_VERSION) {
applyTheme(customThemeSource)
} else {
applyTheme(customTheme)
}
} else if (theme) {
// do nothing, it will load asynchronously
} else {
console.error('Failed to load any theme!')
document.querySelector('#status').textContent = i18n.global.t('splash.theme')
try {
await store.dispatch('setTheme').catch((e) => { console.error('Error setting theme', e) })
} catch (e) {
return Promise.reject(e)
}
applyConfig(store.state.config)
applyConfig(store.state.config, i18n.global)
// Now we can try getting the server settings and logging in
// Most of these are preloaded into the index.html so blocking is minimized
document.querySelector('#status').textContent = i18n.global.t('splash.instance')
await Promise.all([
checkOAuthToken({ store }),
getInstancePanel({ store }),
getNodeInfo({ store }),
getInstanceConfig({ store })
])
]).catch(e => Promise.reject(e))
// Start fetching things that don't need to block the UI
store.dispatch('fetchMutes')
@ -414,9 +399,9 @@ const afterStoreSetup = async ({ store, i18n }) => {
// remove after vue 3.3
app.config.unwrapInjectedRef = true
document.querySelector('#status').textContent = i18n.global.t('splash.almost')
app.mount('#app')
return app
}

View file

@ -25,6 +25,9 @@ import ListsTimeline from 'components/lists_timeline/lists_timeline.vue'
import ListsEdit from 'components/lists_edit/lists_edit.vue'
import NavPanel from 'src/components/nav_panel/nav_panel.vue'
import AnnouncementsPage from 'components/announcements_page/announcements_page.vue'
import QuotesTimeline from '../components/quotes_timeline/quotes_timeline.vue'
import BookmarkFolders from '../components/bookmark_folders/bookmark_folders.vue'
import BookmarkFolderEdit from '../components/bookmark_folder_edit/bookmark_folder_edit.vue'
export default (store) => {
const validateAuthenticatedRoute = (to, from, next) => {
@ -51,6 +54,7 @@ export default (store) => {
{ name: 'tag-timeline', path: '/tag/:tag', component: TagTimeline },
{ name: 'bookmarks', path: '/bookmarks', component: BookmarkTimeline },
{ name: 'conversation', path: '/notice/:id', component: ConversationPage, meta: { dontScroll: true } },
{ name: 'quotes', path: '/notice/:id/quotes', component: QuotesTimeline },
{
name: 'remote-user-profile-acct',
path: '/remote-users/:_(@)?:username([^/@]+)@:hostname([^/@]+)',
@ -84,7 +88,11 @@ export default (store) => {
{ name: 'lists-timeline', path: '/lists/:id', component: ListsTimeline },
{ name: 'lists-edit', path: '/lists/:id/edit', component: ListsEdit },
{ name: 'lists-new', path: '/lists/new', component: ListsEdit },
{ name: 'edit-navigation', path: '/nav-edit', component: NavPanel, props: () => ({ forceExpand: true, forceEditMode: true }), beforeEnter: validateAuthenticatedRoute }
{ name: 'edit-navigation', path: '/nav-edit', component: NavPanel, props: () => ({ forceExpand: true, forceEditMode: true }), beforeEnter: validateAuthenticatedRoute },
{ name: 'bookmark-folders', path: '/bookmark_folders', component: BookmarkFolders },
{ name: 'bookmark-folder-new', path: '/bookmarks/new-folder', component: BookmarkFolderEdit },
{ name: 'bookmark-folder', path: '/bookmarks/:id', component: BookmarkTimeline },
{ name: 'bookmark-folder-edit', path: '/bookmarks/:id/edit', component: BookmarkFolderEdit }
]
if (store.state.instance.pleromaChatMessagesAvailable) {

View file

@ -11,14 +11,14 @@
<template v-if="relationship.following">
<button
v-if="relationship.showing_reblogs"
class="btn button-default dropdown-item"
class="dropdown-item menu-item"
@click="hideRepeats"
>
{{ $t('user_card.hide_repeats') }}
</button>
<button
v-if="!relationship.showing_reblogs"
class="btn button-default dropdown-item"
class="dropdown-item menu-item"
@click="showRepeats"
>
{{ $t('user_card.show_repeats') }}
@ -31,34 +31,34 @@
<UserListMenu :user="user" />
<button
v-if="relationship.followed_by"
class="btn button-default btn-block dropdown-item"
class="dropdown-item menu-item"
@click="removeUserFromFollowers"
>
{{ $t('user_card.remove_follower') }}
</button>
<button
v-if="relationship.blocking"
class="btn button-default btn-block dropdown-item"
class="dropdown-item menu-item"
@click="unblockUser"
>
{{ $t('user_card.unblock') }}
</button>
<button
v-else
class="btn button-default btn-block dropdown-item"
class="dropdown-item menu-item"
@click="blockUser"
>
{{ $t('user_card.block') }}
</button>
<button
class="btn button-default btn-block dropdown-item"
class="dropdown-item menu-item"
@click="reportUser"
>
{{ $t('user_card.report') }}
</button>
<button
v-if="pleromaChatMessagesAvailable"
class="btn button-default btn-block dropdown-item"
class="dropdown-item menu-item"
@click="openChat"
>
{{ $t('user_card.message') }}
@ -122,19 +122,12 @@
<script src="./account_actions.js"></script>
<style lang="scss">
@import "../../variables";
.AccountActions {
.ellipsis-button {
width: 2.5em;
margin: -0.5em 0;
padding: 0.5em 0;
text-align: center;
&:not(:hover) .icon {
color: $fallback--lightText;
color: var(--lightText, $fallback--lightText);
}
}
}
</style>

View file

@ -0,0 +1,53 @@
export default {
name: 'Alert',
selector: '.alert',
validInnerComponents: [
'Text',
'Icon',
'Link',
'Border',
'ButtonUnstyled'
],
variants: {
normal: '.neutral',
error: '.error',
warning: '.warning',
success: '.success'
},
defaultRules: [
{
directives: {
background: '--text',
opacity: 0.5,
blur: '9px'
}
},
{
parent: {
component: 'Alert'
},
component: 'Border',
directives: {
textColor: '--parent'
}
},
{
variant: 'error',
directives: {
background: '--cRed'
}
},
{
variant: 'warning',
directives: {
background: '--cOrange'
}
},
{
variant: 'success',
directives: {
background: '--cGreen'
}
}
]
}

View file

@ -99,16 +99,14 @@
<script src="./announcement.js"></script>
<style lang="scss">
@import "../../variables";
.announcement {
border-bottom: 1px solid var(--border, $fallback--border);
border-bottom: 1px solid var(--border);
border-radius: 0;
padding: var(--status-margin, $status-margin);
padding: var(--status-margin);
.heading,
.body {
margin-bottom: var(--status-margin, $status-margin);
margin-bottom: var(--status-margin);
}
.footer {

View file

@ -3,7 +3,7 @@
<textarea
ref="textarea"
v-model="announcement.content"
class="post-textarea"
class="input post-textarea"
rows="1"
cols="1"
:placeholder="$t('announcements.post_placeholder')"
@ -14,6 +14,7 @@
<input
id="announcement-start-time"
v-model="announcement.startsAt"
class="input"
:type="announcement.allDay ? 'date' : 'datetime-local'"
:disabled="disabled"
>
@ -23,6 +24,7 @@
<input
id="announcement-end-time"
v-model="announcement.endsAt"
class="input"
:type="announcement.allDay ? 'date' : 'datetime-local'"
:disabled="disabled"
>

View file

@ -61,15 +61,13 @@
<script src="./announcements_page.js"></script>
<style lang="scss">
@import "../../variables";
.announcements-page {
.post-form {
padding: var(--status-margin, $status-margin);
padding: var(--status-margin);
.heading,
.body {
margin-bottom: var(--status-margin, $status-margin);
margin-bottom: var(--status-margin);
}
.post-button {

View file

@ -1,5 +1,3 @@
@import "../../variables";
.Attachment {
display: inline-flex;
flex-direction: column;
@ -9,10 +7,8 @@
height: 100%;
border-style: solid;
border-width: 1px;
border-radius: $fallback--attachmentRadius;
border-radius: var(--attachmentRadius, $fallback--attachmentRadius);
border-color: $fallback--border;
border-color: var(--border, $fallback--border);
border-radius: var(--roundness);
border-color: var(--border);
.attachment-wrapper {
flex: 1 1 auto;
@ -84,6 +80,13 @@
}
}
.video-container {
border: none;
outline: none;
color: inherit;
background: transparent;
}
.audio-container {
display: flex;
align-items: flex-end;
@ -126,23 +129,12 @@
.attachment-button {
padding: 0;
border-radius: $fallback--tooltipRadius;
border-radius: var(--tooltipRadius, $fallback--tooltipRadius);
border-radius: var(--roundness);
text-align: center;
width: 2em;
height: 2em;
margin-left: 0.5em;
font-size: 1.25em;
// TODO: theming? hard to theme with unknown background image color
background: rgb(230 230 230 / 70%);
.svg-inline--fa {
color: rgb(0 0 0 / 60%);
}
&:hover .svg-inline--fa {
color: rgb(0 0 0 / 90%);
}
}
}
@ -217,8 +209,7 @@
&.-placeholder {
display: inline-block;
color: $fallback--link;
color: var(--postLink, $fallback--link);
color: var(--link);
overflow: hidden;
white-space: nowrap;
height: auto;

View file

@ -0,0 +1,24 @@
export default {
name: 'Attachment',
selector: '.Attachment',
validInnerComponents: [
'Border',
'ButtonUnstyled',
'Input'
],
defaultRules: [
{
directives: {
roundness: 3
}
},
{
component: 'ButtonUnstyled',
parent: { component: 'Attachment' },
directives: {
background: '#FFFFFF',
opacity: 0.5
}
}
]
}

View file

@ -38,7 +38,7 @@
v-if="edit"
v-model="localDescription"
type="text"
class="description-field"
class="input description-field"
:placeholder="$t('post_status.media_description')"
@keydown.enter.prevent=""
>
@ -175,7 +175,6 @@
:is="videoTag"
v-if="type === 'video' && !hidden"
class="video-container"
:class="{ 'button-unstyled': 'isModal' }"
:href="attachment.url"
@click.stop.prevent="openModal"
>
@ -253,7 +252,7 @@
v-if="edit"
v-model="localDescription"
type="text"
class="description-field"
class="input description-field"
:placeholder="$t('post_status.media_description')"
@keydown.enter.prevent=""
>

View file

@ -1,3 +1,4 @@
<!-- FIXME THIS NEEDS TO BE REFACTORED TO USE POPOVER -->
<template>
<div
v-click-outside="onClickOutside"
@ -6,12 +7,12 @@
<input
v-model="term"
:placeholder="placeholder"
class="autosuggest-input"
class="input autosuggest-input"
@click="onInputClick"
>
<div
v-if="resultsVisible && filtered.length > 0"
class="autosuggest-results"
class="panel autosuggest-results"
>
<slot
v-for="item in filtered"
@ -24,8 +25,6 @@
<script src="./autosuggest.js"></script>
<style lang="scss">
@import "../../variables";
.autosuggest {
position: relative;
@ -40,18 +39,15 @@
top: 100%;
right: 0;
max-height: 400px;
background-color: $fallback--bg;
background-color: var(--bg, $fallback--bg);
background-color: var(--bg);
border-style: solid;
border-width: 1px;
border-color: $fallback--border;
border-color: var(--border, $fallback--border);
border-radius: $fallback--inputRadius;
border-radius: var(--inputRadius, $fallback--inputRadius);
border-color: var(--border);
border-radius: var(--roundness);
border-top-left-radius: 0;
border-top-right-radius: 0;
box-shadow: 1px 1px 4px rgb(0 0 0 / 60%);
box-shadow: var(--panelShadow);
box-shadow: var(--shadow);
overflow-y: auto;
z-index: 1;
}

View file

@ -17,8 +17,6 @@
<script src="./avatar_list.js"></script>
<style lang="scss">
@import "../../variables";
.avatars {
display: flex;
margin: 0;
@ -36,8 +34,7 @@
}
.avatar-small {
border-radius: $fallback--avatarAltRadius;
border-radius: var(--avatarAltRadius, $fallback--avatarAltRadius);
border-radius: var(--roundness);
height: 24px;
width: 24px;
}

View file

@ -0,0 +1,30 @@
export default {
name: 'Badge',
selector: '.badge',
validInnerComponents: [
'Text',
'Icon'
],
variants: {
notification: '.-notification'
},
defaultRules: [
{
component: 'Root',
directives: {
'--badgeNotification': 'color | --cRed'
}
},
{
directives: {
background: '--cGreen'
}
},
{
variant: 'notification',
directives: {
background: '--cRed'
}
}
]
}

View file

@ -47,7 +47,6 @@
display: flex;
flex: 1 0;
margin: 0;
padding: 0.6em 1em;
--emoji-size: 14px;

View file

@ -0,0 +1,22 @@
import { library } from '@fortawesome/fontawesome-svg-core'
import {
faEllipsisH
} from '@fortawesome/free-solid-svg-icons'
library.add(
faEllipsisH
)
const BookmarkFolderCard = {
props: [
'folder',
'allBookmarks'
],
computed: {
firstLetter () {
return this.folder ? this.folder.name[0] : null
}
}
}
export default BookmarkFolderCard

View file

@ -0,0 +1,111 @@
<template>
<div
v-if="allBookmarks"
class="bookmark-folder-card"
>
<router-link
:to="{ name: 'bookmarks' }"
class="bookmark-folder-name"
>
<span class="icon">
<FAIcon
fixed-width
class="fa-scale-110 menu-icon"
icon="bookmark"
/>
</span>{{ $t('nav.all_bookmarks') }}
</router-link>
</div>
<div
v-else
class="bookmark-folder-card"
>
<router-link
:to="{ name: 'bookmark-folder', params: { id: folder.id } }"
class="bookmark-folder-name"
>
<img
v-if="folder.emoji_url"
class="iconEmoji iconEmoji-image"
:src="folder.emoji_url"
:alt="folder.emoji"
:title="folder.emoji"
>
<span
v-else-if="folder.emoji"
class="iconEmoji"
>
<span>
{{ folder.emoji }}
</span>
</span>
<span
v-else-if="firstLetter"
class="icon iconLetter fa-scale-110"
>{{ firstLetter }}</span>{{ folder.name }}
</router-link>
<router-link
:to="{ name: 'bookmark-folder-edit', params: { id: folder.id } }"
class="button-folder-edit"
>
<FAIcon
class="fa-scale-110 fa-old-padding"
icon="ellipsis-h"
/>
</router-link>
</div>
</template>
<script src="./bookmark_folder_card.js"></script>
<style lang="scss">
.bookmark-folder-card {
display: flex;
align-items: center;
}
a.bookmark-folder-name {
display: flex;
align-items: center;
flex-grow: 1;
.icon,
.iconLetter,
.iconEmoji {
display: inline-block;
height: 2.5rem;
width: 2.5rem;
margin-right: 0.5rem;
}
.icon,
.iconLetter {
font-size: 1.5rem;
line-height: 2.5rem;
text-align: center;
}
.iconEmoji {
text-align: center;
object-fit: contain;
vertical-align: middle;
> span {
font-size: 1.5rem;
line-height: 2.5rem;
}
}
img.iconEmoji {
padding: 0.25em;
box-sizing: border-box;
}
}
.bookmark-folder-name,
.button-folder-edit {
margin: 0;
padding: 1em;
color: var(--link);
}
</style>

View file

@ -0,0 +1,80 @@
import EmojiPicker from '../emoji_picker/emoji_picker.vue'
import apiService from '../../services/api/api.service'
const BookmarkFolderEdit = {
data () {
return {
name: '',
nameDraft: '',
emoji: '',
emojiUrl: null,
emojiDraft: '',
emojiUrlDraft: null,
emojiPickerExpanded: false,
reallyDelete: false
}
},
components: {
EmojiPicker
},
created () {
if (!this.id) return
const credentials = this.$store.state.users.currentUser.credentials
apiService.fetchBookmarkFolders({ credentials })
.then((folders) => {
const folder = folders.find(folder => folder.id === this.id)
if (!folder) return
this.nameDraft = this.name = folder.name
this.emojiDraft = this.emoji = folder.emoji
this.emojiUrlDraft = this.emojiUrl = folder.emoji_url
})
},
computed: {
id () {
return this.$route.params.id
}
},
methods: {
selectEmoji (event) {
this.emojiDraft = event.insertion
this.emojiUrlDraft = event.insertionUrl
},
showEmojiPicker () {
if (!this.emojiPickerExpanded) {
this.$refs.picker.showPicker()
}
},
onShowPicker () {
this.emojiPickerExpanded = true
},
onClosePicker () {
this.emojiPickerExpanded = false
},
updateFolder () {
this.$store.dispatch('setBookmarkFolder', { folderId: this.id, name: this.nameDraft, emoji: this.emojiDraft })
.then(() => {
this.$router.push({ name: 'bookmark-folders' })
})
},
createFolder () {
this.$store.dispatch('createBookmarkFolder', { name: this.nameDraft, emoji: this.emojiDraft })
.then(() => {
this.$router.push({ name: 'bookmark-folders' })
})
.catch((e) => {
this.$store.dispatch('pushGlobalNotice', {
messageKey: 'bookmark_folders.error',
messageArgs: [e.message],
level: 'error'
})
})
},
deleteFolder () {
this.$store.dispatch('deleteBookmarkFolder', { folderId: this.id })
this.$router.push({ name: 'bookmark-folders' })
}
}
}
export default BookmarkFolderEdit

View file

@ -0,0 +1,198 @@
<template>
<div class="panel-default panel BookmarkFolderEdit">
<div
ref="header"
class="panel-heading folder-edit-heading"
>
<button
class="button-unstyled go-back-button"
@click="$router.back"
>
<FAIcon
size="lg"
icon="chevron-left"
/>
</button>
<div class="title">
<i18n-t
v-if="id"
keypath="bookmark_folders.editing_folder"
>
<template #folderName>
{{ name }}
</template>
</i18n-t>
<i18n-t
v-else
keypath="bookmark_folders.creating_folder"
/>
</div>
</div>
<div class="panel-body">
<div class="input-wrap">
<label for="folder-edit-title">{{ $t('bookmark_folders.emoji') }}</label>
<button
class="input input-emoji"
:title="$t('bookmark_folder.emoji_pick')"
@click="showEmojiPicker"
>
<img
v-if="emojiUrlDraft"
class="iconEmoji iconEmoji-image"
:src="emojiUrlDraft"
:alt="emojiDraft"
:title="emojiDraft"
>
<span
v-else-if="emojiDraft"
class="iconEmoji"
>
<span>
{{ emojiDraft }}
</span>
</span>
</button>
<EmojiPicker
ref="picker"
class="emoji-picker-panel"
@emoji="selectEmoji"
@show="onShowPicker"
@close="onClosePicker"
/>
</div>
<div class="input-wrap">
<label for="folder-edit-title">{{ $t('bookmark_folders.name') }}</label>
<input
id="folder-edit-title"
ref="name"
v-model="nameDraft"
class="input"
>
</div>
</div>
<div class="panel-footer">
<span class="spacer" />
<button
v-if="!id"
class="btn button-default footer-button"
@click="createFolder"
>
{{ $t('bookmark_folders.create') }}
</button>
<button
v-else-if="!reallyDelete"
class="btn button-default footer-button"
@click="reallyDelete = true"
>
{{ $t('bookmark_folders.delete') }}
</button>
<template v-else>
{{ $t('bookmark_folders.really_delete') }}
<button
class="btn button-default footer-button"
@click="deleteFolder"
>
{{ $t('general.yes') }}
</button>
<button
class="btn button-default footer-button"
@click="reallyDelete = false"
>
{{ $t('general.no') }}
</button>
</template>
<div
v-if="id && !reallyDelete"
>
<button
class="btn button-default follow-button"
@click="updateFolder"
>
{{ $t('bookmark_folders.update_folder') }}
</button>
</div>
</div>
</div>
</template>
<script src="./bookmark_folder_edit.js"></script>
<style lang="scss">
.BookmarkFolderEdit {
--panel-body-padding: 0.5em;
overflow: hidden;
display: flex;
flex-direction: column;
.folder-edit-heading {
grid-template-columns: auto minmax(50%, 1fr);
}
.panel-body {
display: flex;
gap: 0.5em;
}
.emoji-picker-panel {
position: absolute;
z-index: 20;
margin-top: 2px;
&.hide {
display: none;
}
}
.input-emoji {
height: 2.5em;
width: 2.5em;
padding: 0;
.iconEmoji {
display: inline-block;
text-align: center;
object-fit: contain;
vertical-align: middle;
height: 2.5em;
width: 2.5em;
> span {
font-size: 1.5rem;
line-height: 2.5rem;
}
}
img.iconEmoji {
padding: 0.25em;
box-sizing: border-box;
}
}
.input-wrap {
display: flex;
flex-direction: column;
gap: 0.5em;
}
.go-back-button {
text-align: center;
line-height: 1;
height: 100%;
align-self: start;
width: var(--__panel-heading-height-inner);
}
.btn {
margin: 0 0.5em;
}
.panel-footer {
grid-template-columns: minmax(10%, 1fr);
.footer-button {
min-width: 9em;
}
}
}
</style>

View file

@ -0,0 +1,27 @@
import BookmarkFolderCard from '../bookmark_folder_card/bookmark_folder_card.vue'
const BookmarkFolders = {
data () {
return {
isNew: false
}
},
components: {
BookmarkFolderCard
},
computed: {
bookmarkFolders () {
return this.$store.state.bookmarkFolders.allFolders
}
},
methods: {
cancelNewFolder () {
this.isNew = false
},
newFolder () {
this.isNew = true
}
}
}
export default BookmarkFolders

View file

@ -0,0 +1,37 @@
<template>
<div class="Bookmark-folders panel panel-default">
<div class="panel-heading">
<div class="title">
{{ $t('nav.bookmark_folders') }}
</div>
<router-link
:to="{ name: 'bookmark-folder-new' }"
class="button-default btn new-folder-button"
>
{{ $t("bookmark_folders.new") }}
</router-link>
</div>
<div class="panel-body">
<BookmarkFolderCard
:all-bookmarks="true"
class="list-item"
/>
<BookmarkFolderCard
v-for="folder in bookmarkFolders.slice().reverse()"
:key="folder"
:folder="folder"
class="list-item"
/>
</div>
</div>
</template>
<script src="./bookmark_folders.js"></script>
<style lang="scss">
.Bookmark-folders {
.new-folder-button {
padding: 0 0.5em;
}
}
</style>

View file

@ -0,0 +1,16 @@
import { mapState } from 'vuex'
import NavigationEntry from 'src/components/navigation/navigation_entry.vue'
import { getBookmarkFolderEntries } from 'src/components/navigation/filter.js'
export const BookmarkFoldersMenuContent = {
components: {
NavigationEntry
},
computed: {
...mapState({
folders: getBookmarkFolderEntries
})
}
}
export default BookmarkFoldersMenuContent

View file

@ -0,0 +1,19 @@
<template>
<ul>
<NavigationEntry
:item="{
name: 'bookmarks',
routeObject: { name: 'bookmarks' },
label: 'nav.all_bookmarks',
icon: 'bookmark'
}"
/>
<NavigationEntry
v-for="item in folders"
:key="item.id"
:item="item"
/>
</ul>
</template>
<script src="./bookmark_folders_menu_content.js"></script>

View file

@ -1,16 +1,31 @@
import Timeline from '../timeline/timeline.vue'
const Bookmarks = {
computed: {
timeline () {
return this.$store.state.statuses.timelines.bookmarks
}
created () {
this.$store.commit('clearTimeline', { timeline: 'bookmarks' })
this.$store.dispatch('startFetchingTimeline', { timeline: 'bookmarks', bookmarkFolderId: this.folderId || null })
},
components: {
Timeline
},
computed: {
folderId () {
return this.$route.params.id
},
timeline () {
return this.$store.state.statuses.timelines.bookmarks
}
},
watch: {
folderId () {
this.$store.commit('clearTimeline', { timeline: 'bookmarks' })
this.$store.dispatch('stopFetchingTimeline', 'bookmarks')
this.$store.dispatch('startFetchingTimeline', { timeline: 'bookmarks', bookmarkFolderId: this.folderId || null })
}
},
unmounted () {
this.$store.commit('clearTimeline', { timeline: 'bookmarks' })
this.$store.dispatch('stopFetchingTimeline', 'bookmarks')
}
}

View file

@ -3,6 +3,7 @@
:title="$t('nav.bookmarks')"
:timeline="timeline"
:timeline-name="'bookmarks'"
:bookmark-folder-id="folderId"
/>
</template>

View file

@ -0,0 +1,13 @@
export default {
name: 'Border',
selector: '/*border*/',
virtual: true,
defaultRules: [
{
directives: {
textColor: '$mod(--parent, 10)',
textAuto: 'no-auto'
}
}
]
}

View file

@ -0,0 +1,112 @@
export default {
name: 'Button', // Name of the component
selector: '.button-default', // CSS selector/prefix
// outOfTreeSelector: '' // out-of-tree selector is used when other components are laid over it but it's not part of the tree, see Underlay component
// States, system witll calculate ALL possible combinations of those and prepend "normal" to them + standalone "normal" state
states: {
// States are a bit expensive - the amount of combinations generated is about (1/6)n^3+n, so adding more state increased number of combination by an order of magnitude!
// All states inherit from "normal" state, there is no other inheirtance, i.e. hover+disabled only inherits from "normal", not from hover nor disabled.
// However, cascading still works, so resulting state will be result of merging of all relevant states/variants
// normal: '' // normal state is implicitly added, it is always included
toggled: '.toggled',
pressed: ':active',
hover: ':hover:not(:disabled)',
focused: ':focus-within',
disabled: ':disabled'
},
// Variants are mutually exclusive, each component implicitly has "normal" variant, and all other variants inherit from it.
variants: {
// Variants save on computation time since adding new variant just adds one more "set".
// normal: '', // you can override normal variant, it will be appenended to the main class
danger: '.danger'
// Overall the compuation difficulty is N*((1/6)M^3+M) where M is number of distinct states and N is number of variants.
// This (currently) is further multipled by number of places where component can exist.
},
// This lists all other components that can possibly exist within one. Recursion is currently not supported (and probably won't be supported ever).
validInnerComponents: [
'Text',
'Icon'
],
// Default rules, used as "default theme", essentially.
defaultRules: [
{
component: 'Root',
directives: {
'--defaultButtonHoverGlow': 'shadow | 0 0 4 --text',
'--defaultButtonShadow': 'shadow | 0 0 2 #000000',
'--defaultButtonBevel': 'shadow | $borderSide(#FFFFFF, top, 0.2), $borderSide(#000000, bottom, 0.2)',
'--pressedButtonBevel': 'shadow | $borderSide(#FFFFFF, bottom, 0.2), $borderSide(#000000, top, 0.2)'
}
},
{
// component: 'Button', // no need to specify components every time unless you're specifying how other component should look
// like within it
directives: {
background: '--fg',
shadow: ['--defaultButtonShadow', '--defaultButtonBevel'],
roundness: 3
}
},
{
state: ['hover'],
directives: {
shadow: ['--defaultButtonHoverGlow', '--defaultButtonBevel']
}
},
{
state: ['pressed'],
directives: {
shadow: ['--defaultButtonShadow', '--pressedButtonBevel']
}
},
{
state: ['hover', 'pressed'],
directives: {
shadow: ['--defaultButtonHoverGlow', '--pressedButtonBevel']
}
},
{
state: ['toggled'],
directives: {
background: '--inheritedBackground,-14.2',
shadow: ['--defaultButtonShadow', '--pressedButtonBevel']
}
},
{
state: ['toggled', 'hover'],
directives: {
background: '--inheritedBackground,-14.2',
shadow: ['--defaultButtonHoverGlow', '--pressedButtonBevel']
}
},
{
state: ['disabled'],
directives: {
background: '$blend(--inheritedBackground, 0.25, --parent)',
shadow: ['--defaultButtonBevel']
}
},
{
component: 'Text',
parent: {
component: 'Button',
state: ['disabled']
},
directives: {
textOpacity: 0.25,
textOpacityMode: 'blend'
}
},
{
component: 'Icon',
parent: {
component: 'Button',
state: ['disabled']
},
directives: {
textOpacity: 0.25,
textOpacityMode: 'blend'
}
}
]
}

View file

@ -0,0 +1,96 @@
export default {
name: 'ButtonUnstyled',
selector: '.button-unstyled',
states: {
toggled: '.toggled',
disabled: ':disabled',
hover: ':hover:not(:disabled)',
focused: ':focus-within'
},
validInnerComponents: [
'Text',
'Icon',
'Badge'
],
defaultRules: [
{
directives: {
background: '#ffffff',
opacity: 0,
shadow: []
}
},
{
component: 'Icon',
parent: {
component: 'ButtonUnstyled',
state: ['hover']
},
directives: {
textColor: '--parent--text'
}
},
{
component: 'Icon',
parent: {
component: 'ButtonUnstyled',
state: ['toggled']
},
directives: {
textColor: '--parent--text'
}
},
{
component: 'Icon',
parent: {
component: 'ButtonUnstyled',
state: ['toggled', 'hover']
},
directives: {
textColor: '--parent--text'
}
},
{
component: 'Icon',
parent: {
component: 'ButtonUnstyled',
state: ['toggled', 'focused']
},
directives: {
textColor: '--parent--text'
}
},
{
component: 'Icon',
parent: {
component: 'ButtonUnstyled',
state: ['toggled', 'focused', 'hover']
},
directives: {
textColor: '--parent--text'
}
},
{
component: 'Text',
parent: {
component: 'ButtonUnstyled',
state: ['disabled']
},
directives: {
textOpacity: 0.25,
textOpacityMode: 'blend'
}
},
{
component: 'Icon',
parent: {
component: 'ButtonUnstyled',
state: ['disabled']
},
directives: {
textOpacity: 0.25,
textOpacityMode: 'blend'
}
}
]
}

View file

@ -11,15 +11,15 @@
.chat-view-body {
box-sizing: border-box;
background-color: var(--chatBg, $fallback--bg);
display: flex;
flex-direction: column;
width: 100%;
overflow: visible;
min-height: calc(100vh - var(--navbar-height));
margin: 0;
border-radius: 10px 10px 0 0;
border-radius: var(--panelRadius, 10px) var(--panelRadius, 10px) 0 0;
border-radius: var(--roundness);
border-bottom-left-radius: 0;
border-bottom-right-radius: 0;
&::after {
border-radius: 0;
@ -37,8 +37,6 @@
.footer {
position: sticky;
bottom: 0;
background-color: $fallback--bg;
background-color: var(--bg, $fallback--bg);
z-index: 1;
}
@ -61,8 +59,6 @@
position: absolute;
right: 1.3em;
top: -3.2em;
background-color: $fallback--fg;
background-color: var(--btn, $fallback--fg);
display: flex;
justify-content: center;
align-items: center;
@ -79,12 +75,6 @@
visibility: visible;
}
i {
font-size: 1em;
color: $fallback--text;
color: var(--text, $fallback--text);
}
.unread-message-count {
font-size: 0.8em;
left: 50%;

View file

@ -0,0 +1,19 @@
export default {
name: 'Chat',
selector: '.chat-message-list',
validInnerComponents: [
'Text',
'Link',
'Icon',
'Avatar',
'ChatMessage'
],
defaultRules: [
{
directives: {
background: '--bg',
blur: '5px'
}
}
]
}

View file

@ -26,7 +26,7 @@
</div>
</div>
<div
class="message-list"
class="chat-message-list message-list"
:style="{ height: scrollableContainerHeight }"
>
<template v-if="!errorLoadingChat">
@ -61,7 +61,7 @@
<FAIcon icon="chevron-down" />
<div
v-if="newMessageCount"
class="badge badge-notification unread-chat-count unread-message-count"
class="badge -notification unread-chat-count unread-message-count"
>
{{ newMessageCount }}
</div>
@ -95,6 +95,5 @@
<script src="./chat.js"></script>
<style lang="scss">
@import "../../variables";
@import "./chat";
</style>

View file

@ -45,8 +45,6 @@
<script src="./chat_list.js"></script>
<style lang="scss">
@import "../../variables";
.chat-list {
min-height: 25em;
margin-bottom: 0;
@ -57,8 +55,7 @@
font-size: 1.2em;
display: flex;
justify-content: center;
color: $fallback--text;
color: var(--faint, $fallback--text);
color: var(--textFaint);
}
</style>

View file

@ -1,8 +1,6 @@
.chat-list-item {
display: flex;
flex-direction: row;
padding: 0.75em;
height: 5em;
overflow: hidden;
box-sizing: border-box;
cursor: pointer;
@ -11,11 +9,6 @@
outline: none;
}
&:hover {
background-color: var(--selectedPost, $fallback--lightBg);
box-shadow: 0 0 3px 1px rgb(0 0 0 / 10%);
}
.chat-list-item-left {
margin-right: 1em;
}
@ -29,7 +22,7 @@
.heading {
width: 100%;
display: inline-flex;
display: flex;
justify-content: space-between;
line-height: 1em;
}
@ -47,18 +40,17 @@
}
.chat-preview {
display: inline-flex;
display: flex;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
margin: 0.35em 0;
color: $fallback--text;
color: var(--faint, $fallback--text);
color: var(--textFaint);
width: 100%;
}
a {
color: var(--faintLink, $fallback--link);
color: var(--linkFaint);
text-decoration: none;
pointer-events: none;
}
@ -73,11 +65,6 @@
}
}
.Avatar {
border-radius: $fallback--avatarAltRadius;
border-radius: var(--avatarAltRadius, $fallback--avatarAltRadius);
}
.chat-preview-body {
--emoji-size: 1.4em;

View file

@ -36,7 +36,7 @@
/>
<div
v-if="chat.unread > 0"
class="badge badge-notification unread-chat-count"
class="badge -notification unread-chat-count"
>
{{ chat.unread }}
</div>
@ -48,6 +48,5 @@
<script src="./chat_list_item.js"></script>
<style lang="scss">
@import "../../variables";
@import "./chat_list_item";
</style>

View file

@ -1,5 +1,3 @@
@import "../../variables";
.chat-message-wrapper {
&.hovered-message-chain {
.animated.Avatar {
@ -27,12 +25,6 @@
.menu-icon {
cursor: pointer;
&:hover,
.extra-button-popover.open & {
color: $fallback--text;
color: var(--text, $fallback--text);
}
}
.popover {
@ -61,10 +53,12 @@
}
.status {
border-radius: $fallback--chatMessageRadius;
border-radius: var(--chatMessageRadius, $fallback--chatMessageRadius);
background-color: var(--background);
color: var(--text);
border-radius: var(--roundness);
display: flex;
padding: 0.75em;
border: 1px solid var(--border);
}
.created-at {
@ -97,8 +91,7 @@
.error {
.status-content.media-body,
.created-at {
color: $fallback--cRed;
color: var(--badgeNotification, $fallback--cRed);
color: var(--badgeNotification);
}
}
@ -117,16 +110,6 @@
align-content: end;
justify-content: flex-end;
a {
color: var(--chatMessageOutgoingLink, $fallback--link);
}
.status {
color: var(--chatMessageOutgoingText, $fallback--text);
background-color: var(--chatMessageOutgoingBg, $fallback--lightBg);
border: 1px solid var(--chatMessageOutgoingBorder, --lightBg);
}
.chat-message-inner {
align-items: flex-end;
}
@ -137,22 +120,6 @@
}
.incoming {
a {
color: var(--chatMessageIncomingLink, $fallback--link);
}
.status {
color: var(--chatMessageIncomingText, $fallback--text);
background-color: var(--chatMessageIncomingBg, $fallback--bg);
border: 1px solid var(--chatMessageIncomingBorder, --border);
}
.created-at {
a {
color: var(--chatMessageIncomingText, $fallback--text);
}
}
.chat-message-menu {
left: 0.4rem;
}
@ -176,6 +143,5 @@
margin: 1.4em 0;
font-size: 0.9em;
user-select: none;
color: $fallback--text;
color: var(--faintedText, $fallback--text);
color: var(--textFaint);
}

View file

@ -0,0 +1,30 @@
export default {
name: 'ChatMessage',
selector: '.chat-message',
variants: {
outgoing: '.outgoing'
},
validInnerComponents: [
'Text',
'Icon',
'Border',
'Button',
'RichContent',
'Attachment',
'PollGraph'
],
defaultRules: [
{
directives: {
background: '--bg, 2',
backgroundNoCssColor: 'yes'
}
},
{
variant: 'outgoing',
directives: {
background: '--bg, 5'
}
}
]
}

View file

@ -53,7 +53,7 @@
<template #content>
<div class="dropdown-menu">
<button
class="button-default dropdown-item dropdown-item-icon"
class="menu-item dropdown-item dropdown-item-icon"
@click="deleteMessage"
>
<FAIcon icon="times" /> {{ $t("chats.delete") }}

View file

@ -16,11 +16,6 @@
padding-bottom: 0.7rem;
}
.basic-user-card:hover {
cursor: pointer;
background-color: var(--selectedPost, $fallback--lightBg);
}
.go-back-button {
text-align: center;
line-height: 1;

View file

@ -16,27 +16,29 @@
/>
</button>
</div>
<div class="input-wrap">
<div class="input-search">
<FAIcon
class="search-icon fa-scale-110 fa-old-padding"
icon="search"
/>
<div class="panel-body">
<div class="input-wrap">
<div class="input-search">
<FAIcon
class="search-icon fa-scale-110 fa-old-padding"
icon="search"
/>
</div>
<input
ref="search"
v-model="query"
class="input"
placeholder="Search people"
@input="onInput"
>
</div>
<input
ref="search"
v-model="query"
placeholder="Search people"
@input="onInput"
>
</div>
<div class="member-list">
<div
v-for="user in availableUsers"
:key="user.id"
class="member"
>
<div @click.capture.prevent="goToChat(user)">
<div class="member-list">
<div
v-for="user in availableUsers"
:key="user.id"
class="list-item"
@click.capture.prevent="goToChat(user)"
>
<BasicUserCard :user="user" />
</div>
</div>
@ -46,6 +48,5 @@
<script src="./chat_new.js"></script>
<style lang="scss">
@import "../../variables";
@import "./chat_new";
</style>

View file

@ -26,8 +26,6 @@
<script src="./chat_title.js"></script>
<style lang="scss">
@import "../../variables";
.chat-title {
display: flex;
overflow: hidden;
@ -54,8 +52,7 @@
margin-right: 0.5em;
height: 1.5em;
width: 1.5em;
border-radius: $fallback--avatarAltRadius;
border-radius: var(--avatarAltRadius, $fallback--avatarAltRadius);
border-radius: var(--roundness);
&.animated::before {
display: none;

View file

@ -3,6 +3,13 @@
class="checkbox"
:class="{ disabled, indeterminate, 'indeterminate-fix': indeterminateTransitionFix }"
>
<span
v-if="!!$slots.before"
class="label -before"
:class="{ faint: disabled }"
>
<slot name="before" />
</span>
<input
type="checkbox"
class="visible-for-screenreader-only"
@ -12,13 +19,15 @@
@change="$emit('update:modelValue', $event.target.checked)"
>
<i
class="checkbox-indicator"
class="input -checkbox checkbox-indicator"
:aria-hidden="true"
:class="{ disabled }"
@transitionend.capture="onTransitionEnd"
/>
<span
v-if="!!$slots.default"
class="label"
class="label -after"
:class="{ faint: disabled }"
>
<slot />
</span>
@ -54,7 +63,6 @@ export default {
</script>
<style lang="scss">
@import "../../variables";
@import "../../mixins";
.checkbox {
@ -62,9 +70,15 @@ export default {
display: inline-block;
min-height: 1.2em;
&-indicator {
& > &-indicator {
/* Reset .input stuff */
padding: 0;
margin: 0;
position: relative;
line-height: inherit;
display: inline;
padding-left: 1.2em;
box-shadow: none;
}
&-indicator::before {
@ -76,12 +90,9 @@ export default {
transition: color 200ms;
width: 1.1em;
height: 1.1em;
border-radius: $fallback--checkboxRadius;
border-radius: var(--checkboxRadius, $fallback--checkboxRadius);
box-shadow: 0 0 2px black inset;
box-shadow: var(--inputShadow);
background-color: $fallback--fg;
background-color: var(--input, $fallback--fg);
border-radius: var(--roundness);
box-shadow: var(--shadow);
background-color: var(--background);
vertical-align: top;
text-align: center;
line-height: 1.1em;
@ -91,28 +102,20 @@ export default {
box-sizing: border-box;
}
&.disabled {
.checkbox-indicator::before,
.label {
opacity: 0.5;
}
.label {
color: $fallback--faint;
color: var(--faint, $fallback--faint);
.disabled {
.checkbox-indicator::before {
background-color: var(--background);
}
}
input[type="checkbox"] {
&:checked + .checkbox-indicator::before {
color: $fallback--text;
color: var(--inputText, $fallback--text);
color: var(--text);
}
&:indeterminate + .checkbox-indicator::before {
content: "";
color: $fallback--text;
color: var(--inputText, $fallback--text);
color: var(--text);
}
}
@ -122,8 +125,14 @@ export default {
}
}
& > span {
margin-left: 0.5em;
& > .label {
&.-after {
margin-left: 0.5em;
}
&.-before {
margin-right: 0.5em;
}
}
}
</style>

View file

@ -1,19 +1,19 @@
@import "../../variables";
.color-input {
display: inline-flex;
.label {
flex: 1 1 auto;
}
&-field.input {
display: inline-flex;
flex: 0 0 0;
max-width: 9em;
align-items: stretch;
padding: 0.2em 8px;
input {
color: var(--text);
background: none;
color: $fallback--lightText;
color: var(--inputText, $fallback--lightText);
border: none;
padding: 0;
margin: 0;
@ -23,21 +23,39 @@
min-width: 3em;
padding: 0;
}
}
&.nativeColor {
flex: 0 0 2em;
min-width: 2em;
align-self: stretch;
min-height: 100%;
.nativeColor {
cursor: pointer;
flex: 0 0 auto;
padding: 0;
input {
appearance: none;
max-width: 0;
min-width: 0;
max-height: 0;
/* stylelint-disable-next-line declaration-no-important */
opacity: 0 !important;
}
}
.computedIndicator,
.validIndicator,
.invalidIndicator,
.transparentIndicator {
flex: 0 0 2em;
margin: 0.2em 0.5em;
min-width: 2em;
align-self: stretch;
min-height: 100%;
min-height: 1.1em;
border-radius: var(--roundness);
}
.invalidIndicator {
background: transparent;
box-sizing: border-box;
border: 2px solid var(--cRed);
}
.transparentIndicator {
@ -58,16 +76,26 @@
&::after {
top: 0;
left: 0;
border-top-left-radius: var(--roundness);
}
&::before {
bottom: 0;
right: 0;
border-bottom-right-radius: var(--roundness);
}
}
&.disabled,
&:disabled {
.nativeColor input,
.computedIndicator,
.validIndicator,
.invalidIndicator,
.transparentIndicator {
/* stylelint-disable-next-line declaration-no-important */
opacity: 0.25 !important;
}
}
}
.label {
flex: 1 1 auto;
}
}

View file

@ -6,6 +6,7 @@
<label
:for="name"
class="label"
:class="{ faint: !present || disabled }"
>
{{ label }}
</label>
@ -14,41 +15,68 @@
:model-value="present"
:disabled="disabled"
class="opt"
@update:modelValue="$emit('update:modelValue', typeof modelValue === 'undefined' ? fallback : undefined)"
@update:modelValue="update(typeof modelValue === 'undefined' ? fallback : undefined)"
/>
<div class="input color-input-field">
<div
class="input color-input-field"
:class="{ disabled: !present || disabled }"
>
<input
:id="name + '-t'"
class="textColor unstyled"
:class="{ disabled: !present || disabled }"
type="text"
:value="modelValue || fallback"
:disabled="!present || disabled"
@input="$emit('update:modelValue', $event.target.value)"
>
<input
v-if="validColor"
:id="name"
class="nativeColor unstyled"
type="color"
:value="modelValue || fallback"
:disabled="!present || disabled"
@input="$emit('update:modelValue', $event.target.value)"
@input="updateValue($event.target.value)"
>
<div
v-if="transparentColor"
v-if="validColor"
class="validIndicator"
:style="{backgroundColor: modelValue || fallback}"
/>
<div
v-else-if="transparentColor"
class="transparentIndicator"
/>
<div
v-if="computedColor"
v-else-if="computedColor"
class="computedIndicator"
:style="{backgroundColor: fallback}"
/>
<div
v-else
class="invalidIndicator"
/>
<label class="nativeColor">
<FAIcon icon="eye-dropper" />
<input
:id="name"
class="unstyled"
type="color"
:value="modelValue || fallback"
:disabled="!present || disabled"
:class="{ disabled: !present || disabled }"
@input="updateValue($event.target.value)"
>
</label>
</div>
</div>
</template>
<script>
import Checkbox from '../checkbox/checkbox.vue'
import { hex2rgb } from '../../services/color_convert/color_convert.js'
import { throttle } from 'lodash'
import { library } from '@fortawesome/fontawesome-svg-core'
import {
faEyeDropper
} from '@fortawesome/free-solid-svg-icons'
library.add(
faEyeDropper
)
export default {
components: {
Checkbox
@ -104,16 +132,12 @@ export default {
computedColor () {
return this.modelValue && this.modelValue.startsWith('--')
}
},
methods: {
updateValue: throttle(function (value) {
this.$emit('update:modelValue', value)
}, 100)
}
}
</script>
<style lang="scss" src="./color_input.scss"></style>
<style lang="scss">
.color-control {
input.text-input {
max-width: 7em;
flex: 1;
}
}
</style>

View file

@ -0,0 +1,212 @@
<template>
<div
class="ComponentPreview"
:class="{ '-shadow-controls': shadowControl }"
>
<label
class="header"
v-show="shadowControl"
:class="{ faint: disabled }"
>
{{ $t('settings.style.shadows.offset') }}
</label>
<input
v-show="shadowControl"
:value="shadow?.y"
:disabled="disabled"
:class="{ disabled }"
class="input input-number y-shift-number"
type="number"
@input="e => updateProperty('y', e.target.value)"
>
<input
v-show="shadowControl"
:value="shadow?.y"
:disabled="disabled"
:class="{ disabled }"
class="input input-range y-shift-slider"
type="range"
max="20"
min="-20"
@input="e => updateProperty('y', e.target.value)"
>
<div
class="preview-window"
:class="{ '-light-grid': lightGrid }"
>
<div
class="preview-block"
:style="previewStyle"
/>
</div>
<input
v-show="shadowControl"
:value="shadow?.x"
:disabled="disabled"
:class="{ disabled }"
class="input input-number x-shift-number"
type="number"
@input="e => updateProperty('x', e.target.value)"
>
<input
v-show="shadowControl"
:value="shadow?.x"
:disabled="disabled"
:class="{ disabled }"
class="input input-range x-shift-slider"
type="range"
max="20"
min="-20"
@input="e => updateProperty('x', e.target.value)"
>
<Checkbox
id="lightGrid"
v-model="lightGrid"
:disabled="shadow == null"
name="lightGrid"
class="input-light-grid"
>
{{ $t('settings.style.shadows.light_grid') }}
</Checkbox>
</div>
</template>
<style lang="scss">
.ComponentPreview {
display: grid;
grid-template-columns: 3em 1fr 3em;
grid-template-rows: 2em 1fr 2em;
grid-template-areas:
". header y-num "
". preview y-slide"
"x-num x-slide . "
"options options options";
grid-gap: 0.5em;
.header {
grid-area: header;
justify-self: center;
align-self: baseline;
line-height: 2;
}
.input-light-grid {
grid-area: options;
justify-self: center;
}
.input-number {
min-width: 2em;
}
.x-shift-number {
grid-area: x-num;
}
.x-shift-slider {
grid-area: x-slide;
height: auto;
align-self: start;
min-width: 10em;
}
.y-shift-number {
grid-area: y-num;
}
.y-shift-slider {
grid-area: y-slide;
writing-mode: vertical-lr;
justify-self: left;
min-height: 10em;
}
.x-shift-slider,
.y-shift-slider {
padding: 0;
}
.preview-window {
--__grid-color1: rgb(102 102 102);
--__grid-color2: rgb(153 153 153);
--__grid-color1-disabled: rgba(102 102 102 / 20%);
--__grid-color2-disabled: rgba(153 153 153 / 20%);
&.-light-grid {
--__grid-color1: rgb(205 205 205);
--__grid-color2: rgb(255 255 255);
--__grid-color1-disabled: rgba(205 205 205 / 20%);
--__grid-color2-disabled: rgba(255 255 255 / 20%);
}
grid-area: preview;
aspect-ratio: 1;
display: flex;
align-items: center;
justify-content: center;
min-width: 10em;
min-height: 10em;
background-color: var(--__grid-color2);
background-image:
linear-gradient(45deg, var(--__grid-color1) 25%, transparent 25%),
linear-gradient(-45deg, var(--__grid-color1) 25%, transparent 25%),
linear-gradient(45deg, transparent 75%, var(--__grid-color1) 75%),
linear-gradient(-45deg, transparent 75%, var(--__grid-color1) 75%);
background-size: 20px 20px;
background-position: 0 0, 0 10px, 10px -10px, -10px 0;
border-radius: var(--roundness);
&.disabled {
background-color: var(--__grid-color2-disabled);
background-image:
linear-gradient(45deg, var(--__grid-color1-disabled) 25%, transparent 25%),
linear-gradient(-45deg, var(--__grid-color1-disabled) 25%, transparent 25%),
linear-gradient(45deg, transparent 75%, var(--__grid-color1-disabled) 75%),
linear-gradient(-45deg, transparent 75%, var(--__grid-color1-disabled) 75%);
}
.preview-block {
background: var(--background, var(--bg));
display: flex;
justify-content: center;
align-items: center;
min-width: 33%;
min-height: 33%;
max-width: 80%;
max-height: 80%;
border-width: 0;
border-style: solid;
border-color: var(--border);
border-radius: var(--roundness);
box-shadow: var(--shadow);
}
}
}
</style>
<script>
import Checkbox from 'src/components/checkbox/checkbox.vue'
export default {
props: [
'shadow',
'shadowControl',
'previewClass',
'previewStyle',
'disabled'
],
data () {
return {
lightGrid: false
}
},
emits: ['update:shadow'],
components: {
Checkbox
},
methods: {
updateProperty (axis, value) {
this.$emit('update:shadow', { axis, value })
}
}
}
</script>

View file

@ -56,7 +56,8 @@ const conversation = {
expanded: false,
threadDisplayStatusObject: {}, // id => 'showing' | 'hidden'
statusContentPropertiesObject: {},
inlineDivePosition: null
inlineDivePosition: null,
loadStatusError: null
}
},
props: [
@ -392,11 +393,15 @@ const conversation = {
this.setHighlight(this.originalStatusId)
})
} else {
this.loadStatusError = null
this.$store.state.api.backendInteractor.fetchStatus({ id: this.statusId })
.then((status) => {
this.$store.dispatch('addNewStatuses', { statuses: [status] })
this.fetchConversation()
})
.catch((error) => {
this.loadStatusError = error
})
}
},
getReplies (id) {

View file

@ -28,7 +28,27 @@
class="rightside-button"
/>
</div>
<div class="conversation-body panel-body">
<div
v-if="isPage && !status"
class="conversation-body"
:class="{ 'panel-body': isExpanded }"
>
<p v-if="!loadStatusError">
<FAIcon
spin
icon="circle-notch"
/>
{{ $t('status.loading') }}
</p>
<p v-else>
{{ $t('status.load_error', { error: loadStatusError }) }}
</p>
</div>
<div
v-else
class="conversation-body"
:class="{ 'panel-body': isExpanded }"
>
<div
v-if="isTreeView"
class="thread-body"
@ -203,6 +223,7 @@
</div>
<div
v-else
class="Conversation -hidden"
:style="hiddenStyle"
/>
</template>
@ -210,14 +231,17 @@
<script src="./conversation.js"></script>
<style lang="scss">
@import "../../variables";
.Conversation {
z-index: 1;
&.-hidden {
background: var(--__panel-background);
backdrop-filter: var(--__panel-backdrop-filter);
}
.conversation-dive-to-top-level-box {
padding: var(--status-margin, $status-margin);
border-bottom: 1px solid var(--border, $fallback--border);
padding: var(--status-margin);
border-bottom: 1px solid var(--border);
border-radius: 0;
/* Make the button stretch along the whole row */
@ -227,20 +251,22 @@
}
.thread-ancestors {
margin-left: var(--status-margin, $status-margin);
border-left: 2px solid var(--border, $fallback--border);
margin-left: var(--status-margin);
border-left: 2px solid var(--border);
}
.thread-ancestor.-faded .StatusContent {
--link: var(--faintLink);
--text: var(--faint);
color: var(--text);
.thread-ancestor.-faded .RichContent {
/* stylelint-disable declaration-no-important */
--text: var(--textFaint) !important;
--link: var(--linkFaint) !important;
--funtextGreentext: var(--funtextGreentextFaint) !important;
--funtextCyantext: var(--funtextCyantextFaint) !important;
/* stylelint-enable declaration-no-important */
}
.thread-ancestor-dive-box {
padding-left: var(--status-margin, $status-margin);
border-bottom: 1px solid var(--border, $fallback--border);
padding-left: var(--status-margin);
border-bottom: 1px solid var(--border);
border-radius: 0;
/* Make the button stretch along the whole row */
@ -253,16 +279,17 @@
}
.thread-ancestor-dive-box-inner {
padding: var(--status-margin, $status-margin);
padding: var(--status-margin);
}
.conversation-status {
border-bottom: 1px solid var(--border, $fallback--border);
border-bottom: 1px solid var(--border);
border-radius: 0;
}
.thread-ancestor-has-other-replies .conversation-status,
&:last-child .conversation-status,
&:last-child:not(.-expanded) .conversation-status,
&.-expanded .conversation-status:last-child,
.thread-ancestor:last-child .conversation-status,
.thread-ancestor:last-child .thread-ancestor-dive-box,
&.-expanded .thread-tree .conversation-status {
@ -270,20 +297,36 @@
}
.thread-ancestors + .thread-tree > .conversation-status {
border-top: 1px solid var(--border, $fallback--border);
border-top: 1px solid var(--border);
}
/* expanded conversation in timeline */
&.status-fadein.-expanded .thread-body {
border-left: 4px solid $fallback--cRed;
border-left-color: var(--cRed, $fallback--cRed);
border-radius: 0 0 $fallback--panelRadius $fallback--panelRadius;
border-radius: 0 0 var(--panelRadius, $fallback--panelRadius) var(--panelRadius, $fallback--panelRadius);
border-bottom: 1px solid var(--border, $fallback--border);
border-left: 4px solid var(--cRed);
border-radius: var(--roundness);
border-top-left-radius: 0;
border-top-right-radius: 0;
border-bottom: 1px solid var(--border);
}
&.-expanded.status-fadein {
margin: calc(var(--status-margin, $status-margin) / 2);
--___margin: calc(var(--status-margin) / 2);
background: var(--background);
margin: var(--___margin);
&::before {
z-index: -1;
content: "";
display: block;
position: absolute;
top: calc(var(--___margin) * -1);
bottom: calc(var(--___margin) * -1);
left: calc(var(--___margin) * -1);
right: calc(var(--___margin) * -1);
background: var(--background);
backdrop-filter: var(--__panel-backdrop-filter);
}
}
}
</style>

View file

@ -1,5 +1,3 @@
@import "../../variables";
.DesktopNav {
width: 100%;
z-index: var(--ZI_navbar);
@ -9,7 +7,7 @@
}
a {
color: var(--topBarLink, $fallback--link);
color: var(--link);
}
.inner-nav {
@ -54,27 +52,7 @@
.button-default {
&,
svg {
color: $fallback--text;
color: var(--btnTopBarText, $fallback--text);
}
&:active {
background-color: $fallback--fg;
background-color: var(--btnPressedTopBar, $fallback--fg);
color: $fallback--text;
color: var(--btnPressedTopBarText, $fallback--text);
}
&:disabled {
color: $fallback--text;
color: var(--btnDisabledTopBarText, $fallback--text);
}
&.toggled {
color: $fallback--text;
color: var(--btnToggledTopBarText, $fallback--text);
background-color: $fallback--fg;
background-color: var(--btnToggledTopBar, $fallback--fg);
color: var(--text);
}
}
@ -94,8 +72,7 @@
mask-repeat: no-repeat;
mask-position: center;
mask-size: contain;
background-color: $fallback--fg;
background-color: var(--topBarText, $fallback--fg);
background-color: var(--text);
position: absolute;
top: 0;
bottom: 0;
@ -116,8 +93,7 @@
text-align: center;
.svg-inline--fa {
color: $fallback--link;
color: var(--topBarLink, $fallback--link);
color: var(--link);
}
}

View file

@ -12,7 +12,7 @@
<slot name="header" />
</div>
</div>
<div class="dialog-modal-content">
<div class="panel-body dialog-modal-content">
<slot name="default" />
</div>
<div class="dialog-modal-footer user-interactions panel-footer">
@ -25,8 +25,6 @@
<script src="./dialog_modal.js"></script>
<style lang="scss">
@import "../../variables";
// TODO: unify with other modals.
.dark-overlay {
&::before {
@ -54,8 +52,6 @@
z-index: 2001;
cursor: default;
display: block;
background-color: $fallback--bg;
background-color: var(--bg, $fallback--bg);
.dialog-modal-heading {
.title {
@ -66,18 +62,13 @@
.dialog-modal-content {
margin: 0;
padding: 1rem;
background-color: $fallback--bg;
background-color: var(--bg, $fallback--bg);
white-space: normal;
}
.dialog-modal-footer {
margin: 0;
padding: 0.5em;
background-color: $fallback--bg;
background-color: var(--bg, $fallback--bg);
border-top: 1px solid $fallback--border;
border-top: 1px solid var(--border, $fallback--border);
border-top: 1px solid var(--border);
display: flex;
justify-content: flex-end;

View file

@ -1,7 +1,7 @@
<template>
<div
ref="root"
class="emoji-input"
class="input emoji-input"
:class="{ 'with-picker': !hideEmojiButton }"
>
<slot
@ -68,9 +68,9 @@
v-for="(suggestion, index) in suggestions"
:id="suggestionItemId(index)"
:key="index"
class="autocomplete-item"
class="menu-item autocomplete-item"
role="option"
:class="{ highlighted: index === highlighted }"
:class="{ '-active': index === highlighted }"
:aria-label="autoCompleteItemLabel(suggestion)"
:aria-selected="index === highlighted"
@click.stop.prevent="onClick($event, suggestion)"
@ -110,9 +110,8 @@
<script src="./emoji_input.js"></script>
<style lang="scss">
@import "../../variables";
.emoji-input {
.input.emoji-input {
padding: 0;
display: flex;
flex-direction: column;
position: relative;
@ -127,8 +126,7 @@
line-height: 24px;
&:hover i {
color: $fallback--text;
color: var(--text, $fallback--text);
color: var(--text);
}
}
@ -145,6 +143,12 @@
input,
textarea {
flex: 1 0 auto;
color: inherit;
/* stylelint-disable-next-line declaration-no-important */
background: none !important;
box-shadow: none;
border: none;
outline: none;
}
&.with-picker input {
@ -179,26 +183,28 @@
position: absolute;
}
&-item {
&-item.menu-item {
display: flex;
cursor: pointer;
padding: 0.2em 0.4em;
border-bottom: 1px solid rgb(0 0 0 / 40%);
height: 32px;
padding-top: 0;
padding-bottom: 0;
.image {
width: 32px;
height: 32px;
line-height: 32px;
width: calc(var(--__line-height) + var(--__vertical-gap) * 2);
height: calc(var(--__line-height) + var(--__vertical-gap) * 2);
line-height: var(--__line-height);
text-align: center;
font-size: 32px;
margin-right: 4px;
margin-right: var(--__horizontal-gap);
img {
width: 32px;
height: 32px;
width: calc(var(--__line-height) + var(--__vertical-gap) * 2);
height: calc(var(--__line-height) + var(--__vertical-gap) * 2);
object-fit: contain;
}
span {
font-size: var(--__line-height);
line-height: var(--__line-height);
}
}
.label {
@ -216,17 +222,6 @@
line-height: 9px;
}
}
&.highlighted {
background-color: $fallback--fg;
background-color: var(--selectedMenuPopover, $fallback--fg);
color: var(--selectedMenuPopoverText, $fallback--text);
--faint: var(--selectedMenuPopoverFaintText, $fallback--faint);
--faintLink: var(--selectedMenuPopoverFaintLink, $fallback--faint);
--lightText: var(--selectedMenuPopoverLightText, $fallback--lightText);
--icon: var(--selectedMenuPopoverIcon, $fallback--icon);
}
}
}
</style>

View file

@ -114,11 +114,13 @@ const EmojiPicker = {
groupsScrolledClass: 'scrolled-top',
keepOpen: false,
customEmojiTimeout: null,
hideCustomEmojiInPicker: false,
// Lazy-load only after the first time `showing` becomes true.
contentLoaded: false,
groupRefs: {},
emojiRefs: {},
filteredEmojiGroups: [],
emojiSize: 0,
width: 0
}
},
@ -129,9 +131,28 @@ const EmojiPicker = {
Popover
},
methods: {
updateEmojiSize () {
const css = window.getComputedStyle(this.$refs.popover.$el)
const emojiSize = css.getPropertyValue('--emojiSize')
const emojiSizeUnit = emojiSize.replace(/[0-9,.]+/, '')
const emojiSizeValue = Number(emojiSize.replace(/[^0-9,.]+/, ''))
const fontSize = css.getPropertyValue('font-size').replace(/[^0-9,.]+/, '')
let emojiSizeReal
if (emojiSizeUnit.endsWith('em')) {
emojiSizeReal = emojiSizeValue * fontSize
} else {
emojiSizeReal = emojiSizeValue
}
const fullEmojiSize = emojiSizeReal + (2 * 0.2 * fontSize)
this.emojiSize = fullEmojiSize
},
showPicker () {
this.$refs.popover.showPopover()
this.onShowing()
this.$nextTick(() => {
this.onShowing()
})
},
hidePicker () {
this.$refs.popover.hidePopover()
@ -159,7 +180,7 @@ const EmojiPicker = {
if (!this.keepOpen) {
this.$refs.popover.hidePopover()
}
this.$emit('emoji', { insertion: value, keepOpen: this.keepOpen })
this.$emit('emoji', { insertion: value, insertionUrl: emoji.imageUrl, keepOpen: this.keepOpen })
},
onScroll (startIndex, endIndex, visibleStartIndex, visibleEndIndex) {
const target = this.$refs['emoji-groups'].$el
@ -223,6 +244,7 @@ const EmojiPicker = {
},
onShowing () {
const oldContentLoaded = this.contentLoaded
this.updateEmojiSize()
this.recalculateItemPerRow()
this.$nextTick(() => {
this.$refs.search.focus()
@ -265,16 +287,20 @@ const EmojiPicker = {
},
computed: {
minItemSize () {
return this.emojiHeight
return this.emojiSize
},
// used to watch it
fontSize () {
this.$nextTick(() => {
this.updateEmojiSize()
})
return this.$store.getters.mergedConfig.fontSize
},
emojiHeight () {
return 32 + 4
},
emojiWidth () {
return 32 + 4
return this.emojiSize
},
itemPerRow () {
return this.width ? Math.floor(this.width / this.emojiWidth - 1) : 6
return this.width ? Math.floor(this.width / this.emojiSize) : 6
},
activeGroupView () {
return this.showingStickers ? '' : this.activeGroup
@ -286,7 +312,7 @@ const EmojiPicker = {
return 0
},
allCustomGroups () {
if (this.hideCustomEmoji) {
if (this.hideCustomEmoji || this.hideCustomEmojiInPicker) {
return {}
}
const emojis = this.$store.getters.groupedCustomEmojis

View file

@ -1,62 +1,55 @@
@import "../../variables";
$emoji-picker-header-height: 36px;
$emoji-picker-header-picture-width: 32px;
$emoji-picker-header-picture-height: 32px;
$emoji-picker-emoji-size: 32px;
.emoji-picker {
--__emoji-picker-header: 2.2em;
width: 25em;
max-width: calc(100vw - 20px); // popover gives 10px margin from window edge
display: flex;
flex-direction: column;
background-color: $fallback--bg;
background-color: var(--popover, $fallback--bg);
color: $fallback--link;
color: var(--popoverText, $fallback--link);
--faint: var(--popoverFaintText, $fallback--faint);
--faintLink: var(--popoverFaintLink, $fallback--faint);
--lightText: var(--popoverLightText, $fallback--lightText);
--icon: var(--popoverIcon, $fallback--icon);
&-header-image {
display: inline-flex;
justify-content: center;
align-items: center;
width: $emoji-picker-header-picture-width;
max-width: $emoji-picker-header-picture-width;
height: $emoji-picker-header-picture-height;
max-height: $emoji-picker-header-picture-height;
width: var(--__emoji-picker-header);
max-width: var(--__emoji-picker-header);
height: var(--__emoji-picker-header);
max-height: var(--__emoji-picker-header);
.still-image {
max-width: 100%;
max-height: 100%;
height: 100%;
width: 100%;
width: var(--__emoji-picker-header);
max-width: var(--__emoji-picker-header);
height: var(--__emoji-picker-header);
max-height: var(--__emoji-picker-header);
object-fit: contain;
--_still_image-label-scale: 0.5;
}
}
.keep-open,
.too-many-emoji {
padding: 7px;
.too-many-emoji,
.hide-custom-emoji {
padding: 0.5em;
line-height: normal;
}
.hide-custom-emoji {
padding-top: 0;
}
.too-many-emoji {
display: flex;
flex-direction: column;
}
.keep-open-label {
padding: 0 7px;
padding: 0 0.5em;
display: flex;
}
.heading {
display: flex;
padding: 10px 7px 5px;
padding: 0.7em 0.5em 0;
}
.content {
@ -71,14 +64,14 @@ $emoji-picker-emoji-size: 32px;
display: flex;
flex-flow: row nowrap;
overflow-x: auto;
overflow-y: hidden;
}
.additional-tabs {
display: flex;
border-left: 1px solid;
border-left-color: $fallback--icon;
border-left-color: var(--icon, $fallback--icon);
padding-left: 7px;
border-left-color: var(--border);
padding-left: 0.5em;
flex: 0 0 auto;
}
@ -87,30 +80,29 @@ $emoji-picker-emoji-size: 32px;
flex-basis: auto;
display: flex;
align-content: center;
scrollbar-width: thin;
&-item {
padding: 0 7px;
padding: 0 0.5em;
cursor: pointer;
font-size: 1.85em;
width: $emoji-picker-header-picture-width;
max-width: $emoji-picker-header-picture-width;
height: $emoji-picker-header-picture-height;
max-height: $emoji-picker-header-picture-height;
width: var(--__emoji-picker-header);
max-width: var(--__emoji-picker-header);
height: var(--__emoji-picker-header);
max-height: var(--__emoji-picker-header);
display: flex;
align-items: center;
.svg-inline--fa {
font-size: 1.85em;
}
&.disabled {
opacity: 0.5;
pointer-events: none;
}
&.active {
border-bottom: 4px solid;
svg {
color: $fallback--lightText;
color: var(--lightText, $fallback--lightText);
}
&.toggled {
border-bottom: 0.2em solid;
}
}
}
@ -137,7 +129,7 @@ $emoji-picker-emoji-size: 32px;
.emoji {
&-search {
padding: 5px;
padding: 0.3em;
flex: 0 0 auto;
input {
@ -151,6 +143,7 @@ $emoji-picker-emoji-size: 32px;
flex: 1 1 1px;
position: relative;
overflow: auto;
scrollbar-gutter: stable both-edges;
user-select: none;
mask:
linear-gradient(to top, white 0, transparent 100%) bottom no-repeat,
@ -177,13 +170,13 @@ $emoji-picker-emoji-size: 32px;
display: flex;
align-items: center;
flex-wrap: wrap;
padding-left: 5px;
justify-content: left;
&-title {
font-size: 0.85em;
width: 100%;
margin: 0;
padding-left: 0.3em;
&.disabled {
display: none;
@ -192,24 +185,28 @@ $emoji-picker-emoji-size: 32px;
}
&-item {
width: $emoji-picker-emoji-size;
height: $emoji-picker-emoji-size;
width: var(--emoji-size);
height: var(--emoji-size);
box-sizing: border-box;
display: flex;
line-height: $emoji-picker-emoji-size;
line-height: var(--emoji-size);
align-items: center;
justify-content: center;
margin: 4px;
margin: 0.2em;
cursor: pointer;
.emoji-picker-emoji.-custom {
object-fit: contain;
max-width: 100%;
max-height: 100%;
width: var(--emoji-size);
max-width: var(--emoji-size);
height: var(--emoji-size);
max-height: var(--emoji-size);
--_still_image-label-scale: 0.5;
}
.emoji-picker-emoji.-unicode {
font-size: 24px;
font-size: 1.6em;
overflow: hidden;
}
}

View file

@ -23,9 +23,9 @@
v-for="group in filteredEmojiGroups"
:ref="setGroupRef('group-header-' + group.id)"
:key="group.id"
class="emoji-tabs-item"
class="button-unstyled emoji-tabs-item"
:class="{
active: activeGroupView === group.id
toggled: activeGroupView === group.id
}"
:title="group.text"
role="button"
@ -52,8 +52,8 @@
class="additional-tabs"
>
<span
class="stickers-tab-icon additional-tabs-item"
:class="{active: showingStickers}"
class="button-unstyled stickers-tab-icon additional-tabs-item"
:class="{toggled: showingStickers}"
:title="$t('emoji.stickers')"
@click.prevent="toggleStickers"
>
@ -77,7 +77,7 @@
ref="search"
v-model="keyword"
type="text"
class="form-control"
class="input form-control"
:placeholder="$t('emoji.search_emoji')"
@input="$event.target.composing = false"
>
@ -89,6 +89,7 @@
class="emoji-groups"
:class="groupsScrolledClass"
:min-item-size="minItemSize"
:buffer="minItemSize"
:items="emojiItems"
:emit-update="true"
@update="onScroll"
@ -142,6 +143,17 @@
{{ $t('emoji.keep_open') }}
</Checkbox>
</div>
<div
v-if="!hideCustomEmoji"
class="hide-custom-emoji"
>
<Checkbox
v-model="hideCustomEmojiInPicker"
@change="onShowing"
>
{{ $t('emoji.hide_custom_emoji') }}
</Checkbox>
</div>
</div>
<div
v-if="showingStickers"

View file

@ -72,7 +72,6 @@
<script src="./emoji_reactions.js"></script>
<style lang="scss">
@import "../../variables";
@import "../../mixins";
.EmojiReactions {
@ -80,7 +79,7 @@
margin-top: 0.25em;
flex-wrap: wrap;
--emoji-size: calc(1.25em * var(--emojiReactionsScale, 1));
--emoji-size: calc(var(--emojiSize, 1.25em) * var(--emojiReactionsScale, 1));
.emoji-reaction-container {
display: flex;
@ -92,7 +91,6 @@
padding: 0;
.emoji-reaction-count-button {
background-color: var(--btn);
margin: 0;
height: 100%;
border-top-left-radius: 0;
@ -102,11 +100,9 @@
display: inline-flex;
justify-content: center;
align-items: center;
color: $fallback--text;
color: var(--btnText, $fallback--text);
&.-picked-reaction {
border: 1px solid var(--accent, $fallback--link);
border: 1px solid var(--accent);
margin-right: -1px;
}
}
@ -149,18 +145,16 @@
}
.svg-inline--fa {
color: $fallback--text;
color: var(--btnText, $fallback--text);
color: var(--text);
}
&.-picked-reaction {
border: 1px solid var(--accent, $fallback--link);
border: 1px solid var(--accent);
margin-left: -1px; // offset the border, can't use inset shadows either
margin-right: -1px;
.svg-inline--fa {
color: $fallback--link;
color: var(--accent, $fallback--link);
color: var(--accent);
}
}
@ -176,8 +170,7 @@
@include focused-style {
.svg-inline--fa {
color: $fallback--link;
color: var(--accent, $fallback--link);
color: var(--accent);
}
.focus-marker {

View file

@ -1,6 +1,7 @@
import Popover from '../popover/popover.vue'
import genRandomSeed from '../../services/random_seed/random_seed.service.js'
import ConfirmModal from '../confirm_modal/confirm_modal.vue'
import StatusBookmarkFolderMenu from '../status_bookmark_folder_menu/status_bookmark_folder_menu.vue'
import { library } from '@fortawesome/fontawesome-svg-core'
import {
faEllipsisH,
@ -36,7 +37,8 @@ const ExtraButtons = {
props: ['status'],
components: {
Popover,
ConfirmModal
ConfirmModal,
StatusBookmarkFolderMenu
},
data () {
return {
@ -145,6 +147,9 @@ const ExtraButtons = {
canBookmark () {
return !!this.currentUser
},
bookmarkFolders () {
return this.$store.state.instance.pleromaBookmarkFoldersAvailable
},
statusLink () {
return `${this.$store.state.instance.server}${this.$router.resolve({ name: 'conversation', params: { id: this.status.id } }).href}`
},

View file

@ -12,13 +12,13 @@
>
<template #content="{close}">
<div
:id="`popup-menu-${randomSeed}`"
class="dropdown-menu"
role="menu"
:id="`popup-menu-${randomSeed}`"
>
<button
v-if="canMute && !status.thread_muted"
class="button-default dropdown-item dropdown-item-icon"
class="menu-item dropdown-item dropdown-item-icon"
role="menuitem"
@click.prevent="muteConversation"
>
@ -29,7 +29,7 @@
</button>
<button
v-if="canMute && status.thread_muted"
class="button-default dropdown-item dropdown-item-icon"
class="menu-item dropdown-item dropdown-item-icon"
role="menuitem"
@click.prevent="unmuteConversation"
>
@ -40,7 +40,7 @@
</button>
<button
v-if="!status.pinned && canPin"
class="button-default dropdown-item dropdown-item-icon"
class="menu-item dropdown-item dropdown-item-icon"
role="menuitem"
@click.prevent="pinStatus"
@click="close"
@ -52,7 +52,7 @@
</button>
<button
v-if="status.pinned && canPin"
class="button-default dropdown-item dropdown-item-icon"
class="menu-item dropdown-item dropdown-item-icon"
role="menuitem"
@click.prevent="unpinStatus"
@click="close"
@ -65,7 +65,7 @@
<template v-if="canBookmark">
<button
v-if="!status.bookmarked"
class="button-default dropdown-item dropdown-item-icon"
class="menu-item dropdown-item dropdown-item-icon"
role="menuitem"
@click.prevent="bookmarkStatus"
@click="close"
@ -77,7 +77,7 @@
</button>
<button
v-if="status.bookmarked"
class="button-default dropdown-item dropdown-item-icon"
class="menu-item dropdown-item dropdown-item-icon"
role="menuitem"
@click.prevent="unbookmarkStatus"
@click="close"
@ -87,10 +87,14 @@
icon="bookmark"
/><span>{{ $t("status.unbookmark") }}</span>
</button>
<StatusBookmarkFolderMenu
v-if="status.bookmarked && bookmarkFolders"
:status="status"
/>
</template>
<button
v-if="ownStatus && editingAvailable"
class="button-default dropdown-item dropdown-item-icon"
class="menu-item dropdown-item dropdown-item-icon"
role="menuitem"
@click.prevent="editStatus"
@click="close"
@ -102,7 +106,7 @@
</button>
<button
v-if="isEdited && editingAvailable"
class="button-default dropdown-item dropdown-item-icon"
class="menu-item dropdown-item dropdown-item-icon"
role="menuitem"
@click.prevent="showStatusHistory"
@click="close"
@ -114,7 +118,7 @@
</button>
<button
v-if="canDelete"
class="button-default dropdown-item dropdown-item-icon"
class="menu-item dropdown-item dropdown-item-icon"
role="menuitem"
@click.prevent="deleteStatus"
@click="close"
@ -125,7 +129,7 @@
/><span>{{ $t("status.delete") }}</span>
</button>
<button
class="button-default dropdown-item dropdown-item-icon"
class="menu-item dropdown-item dropdown-item-icon"
role="menuitem"
@click.prevent="copyLink"
@click="close"
@ -137,7 +141,7 @@
</button>
<a
v-if="!status.is_local"
class="button-default dropdown-item dropdown-item-icon"
class="menu-item dropdown-item dropdown-item-icon"
role="menuitem"
title="Source"
:href="status.external_url"
@ -149,7 +153,7 @@
/><span>{{ $t("status.external_source") }}</span>
</a>
<button
class="button-default dropdown-item dropdown-item-icon"
class="menu-item dropdown-item dropdown-item-icon"
role="menuitem"
@click.prevent="reportStatus"
@click="close"
@ -201,7 +205,6 @@
<script src="./extra_buttons.js"></script>
<style lang="scss">
@import "../../variables";
@import "../../mixins";
.ExtraButtons {
@ -211,8 +214,7 @@
margin: -10px;
&:hover .svg-inline--fa {
color: $fallback--text;
color: var(--text, $fallback--text);
color: var(--text);
}
}

View file

@ -80,8 +80,6 @@
<script src="./extra_notifications.js" />
<style lang="scss">
@import "../../variables";
.ExtraNotifications {
width: 100%;
display: flex;
@ -91,8 +89,7 @@
.notification {
width: 100%;
border-bottom: 1px solid;
border-color: $fallback--border;
border-color: var(--border, $fallback--border);
border-color: var(--border);
display: flex;
flex-direction: column;
align-items: stretch;

View file

@ -65,7 +65,6 @@
<script src="./favorite_button.js"></script>
<style lang="scss">
@import "../../variables";
@import "../../mixins";
.FavoriteButton {
@ -88,8 +87,7 @@
&:hover .svg-inline--fa,
&.-favorited .svg-inline--fa {
color: $fallback--cOrange;
color: var(--cOrange, $fallback--cOrange);
color: var(--cOrange);
}
@include unfocused-style {

View file

@ -42,8 +42,6 @@
<script src="./flash.js"></script>
<style lang="scss">
@import "../../variables";
.Flash {
display: inline-block;
width: 100%;

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