diff --git a/.browserslistrc b/.browserslistrc new file mode 100644 index 00000000..df2d4716 --- /dev/null +++ b/.browserslistrc @@ -0,0 +1,7 @@ +>0.2% +not op_mini all +Safari > 15 +Firefox >= 115 +Firefox ESR +Android > 4 +not dead diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 25e499c4..f4c5cf43 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -45,6 +45,7 @@ test: stage: test tags: - amd64 + - himem variables: APT_CACHE_DIR: apt-cache script: @@ -58,6 +59,7 @@ build: stage: build tags: - amd64 + - himem script: - yarn - npm run build diff --git a/CHANGELOG.md b/CHANGELOG.md index 444a863c..9844319e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -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 diff --git a/changelog.d/add-apng.add b/changelog.d/add-apng.add deleted file mode 100644 index cdec58af..00000000 --- a/changelog.d/add-apng.add +++ /dev/null @@ -1 +0,0 @@ -Make Pleroma FE to also view apng (Animated PNG) attachment. diff --git a/changelog.d/admin-emoji-packs.add b/changelog.d/admin-emoji-packs.add deleted file mode 100644 index 243163e8..00000000 --- a/changelog.d/admin-emoji-packs.add +++ /dev/null @@ -1 +0,0 @@ -Added emoji pack management to the admin panel diff --git a/changelog.d/appearance-tab.change b/changelog.d/appearance-tab.change deleted file mode 100644 index 7fe1b45e..00000000 --- a/changelog.d/appearance-tab.change +++ /dev/null @@ -1 +0,0 @@ -Reorganized Settings modal to move out visual stuff into Appearance tab diff --git a/changelog.d/public-favorites.skip b/changelog.d/backend-repo-url.skip similarity index 100% rename from changelog.d/public-favorites.skip rename to changelog.d/backend-repo-url.skip diff --git a/changelog.d/better-shadow-control.fix b/changelog.d/better-shadow-control.fix new file mode 100644 index 00000000..585ef6d2 --- /dev/null +++ b/changelog.d/better-shadow-control.fix @@ -0,0 +1 @@ +Updated shadow editor, hopefully fixed long-standing bugs, added ability to specify shadow's name. diff --git a/changelog.d/bookmark-folders.add b/changelog.d/bookmark-folders.add new file mode 100644 index 00000000..f2296660 --- /dev/null +++ b/changelog.d/bookmark-folders.add @@ -0,0 +1 @@ +Support bookmark folders diff --git a/changelog.d/browsers-support.change b/changelog.d/browsers-support.change new file mode 100644 index 00000000..a62e5024 --- /dev/null +++ b/changelog.d/browsers-support.change @@ -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. diff --git a/changelog.d/checkbox.fix b/changelog.d/checkbox.fix new file mode 100644 index 00000000..6a947ec8 --- /dev/null +++ b/changelog.d/checkbox.fix @@ -0,0 +1 @@ +checkbox vertical alignment has been fixed diff --git a/changelog.d/ci-runner.skip b/changelog.d/ci-runner.skip deleted file mode 100644 index ad4b79d5..00000000 --- a/changelog.d/ci-runner.skip +++ /dev/null @@ -1 +0,0 @@ -stop using that one runner for intensive tasks \ No newline at end of file diff --git a/changelog.d/colorfuncs.fix b/changelog.d/colorfuncs.fix new file mode 100644 index 00000000..18c49e2f --- /dev/null +++ b/changelog.d/colorfuncs.fix @@ -0,0 +1 @@ +Fix some of the color manipulation functions diff --git a/changelog.d/create-link-when-url-present.add b/changelog.d/create-link-when-url-present.add deleted file mode 100644 index 11aa3758..00000000 --- a/changelog.d/create-link-when-url-present.add +++ /dev/null @@ -1 +0,0 @@ -Create a link to the URL of the scrobble when it's present diff --git a/changelog.d/custom.add b/changelog.d/custom.add new file mode 100644 index 00000000..97848d7e --- /dev/null +++ b/changelog.d/custom.add @@ -0,0 +1 @@ +Added support for fetching /{resource}.custom.ext to allow adding instance-specific themes without altering sourcetree diff --git a/changelog.d/date-absolute.add b/changelog.d/date-absolute.add new file mode 100644 index 00000000..d9365f46 --- /dev/null +++ b/changelog.d/date-absolute.add @@ -0,0 +1 @@ +Support displaying time in absolute format diff --git a/changelog.d/deprecate-subscribe.change b/changelog.d/deprecate-subscribe.change new file mode 100644 index 00000000..10fb34f4 --- /dev/null +++ b/changelog.d/deprecate-subscribe.change @@ -0,0 +1 @@ +Use /api/v1/accounts/:id/follow for account subscriptions instead of the deprecated routes \ No newline at end of file diff --git a/changelog.d/double-notifications.fix b/changelog.d/double-notifications.fix deleted file mode 100644 index 24e08c0f..00000000 --- a/changelog.d/double-notifications.fix +++ /dev/null @@ -1 +0,0 @@ -Fix native notifications appearing as many times as there are open tabs. Clicking on notification will focus last focused tab. diff --git a/changelog.d/emoji-scale.add b/changelog.d/emoji-scale.add deleted file mode 100644 index 791d80d9..00000000 --- a/changelog.d/emoji-scale.add +++ /dev/null @@ -1 +0,0 @@ -Ability to change size of emoji diff --git a/changelog.d/emoji-size.fix b/changelog.d/emoji-size.fix new file mode 100644 index 00000000..a1189b83 --- /dev/null +++ b/changelog.d/emoji-size.fix @@ -0,0 +1 @@ +fix emoji inconsistencies in notifications, fix some emoji not scaling with interface diff --git a/changelog.d/extra-notifications.add b/changelog.d/extra-notifications.add deleted file mode 100644 index 90f21f54..00000000 --- a/changelog.d/extra-notifications.add +++ /dev/null @@ -1 +0,0 @@ -Support showing extra notifications in the notifications column diff --git a/changelog.d/firefox-redmon.fix b/changelog.d/firefox-redmon.fix deleted file mode 100644 index 64ab9b14..00000000 --- a/changelog.d/firefox-redmon.fix +++ /dev/null @@ -1 +0,0 @@ -Bug with firefox and redmond themes diff --git a/changelog.d/fixes-themes.skip b/changelog.d/fixes-themes.skip deleted file mode 100644 index af691507..00000000 --- a/changelog.d/fixes-themes.skip +++ /dev/null @@ -1 +0,0 @@ -fixed themes for spw and kazvmoew diff --git a/changelog.d/fixes.skip b/changelog.d/fixes.skip deleted file mode 100644 index cc40793e..00000000 --- a/changelog.d/fixes.skip +++ /dev/null @@ -1 +0,0 @@ -fix post appearance tab bugs part I diff --git a/changelog.d/focus-clear.add b/changelog.d/focus-clear.add deleted file mode 100644 index 70f54ab6..00000000 --- a/changelog.d/focus-clear.add +++ /dev/null @@ -1 +0,0 @@ -Focusing into a tab clears all current desktop notifications diff --git a/changelog.d/group-actor.add b/changelog.d/group-actor.add deleted file mode 100644 index 7b62676a..00000000 --- a/changelog.d/group-actor.add +++ /dev/null @@ -1 +0,0 @@ -Support group actors diff --git a/changelog.d/hide-custom-emojis-in-picker.add b/changelog.d/hide-custom-emojis-in-picker.add deleted file mode 100644 index 4cfd2ca8..00000000 --- a/changelog.d/hide-custom-emojis-in-picker.add +++ /dev/null @@ -1 +0,0 @@ -Allow hiding custom emojis in picker. diff --git a/changelog.d/misc-markup.fix b/changelog.d/misc-markup.fix new file mode 100644 index 00000000..7af934a2 --- /dev/null +++ b/changelog.d/misc-markup.fix @@ -0,0 +1 @@ +Fix small markup inconsistencies diff --git a/changelog.d/mobile-chrome-notifs.fix b/changelog.d/mobile-chrome-notifs.fix deleted file mode 100644 index 7db10c56..00000000 --- a/changelog.d/mobile-chrome-notifs.fix +++ /dev/null @@ -1 +0,0 @@ -Fixed error that appeared on mobile Chrome(ium) (and derivatives) when native notifications are allowed diff --git a/changelog.d/mobile-drawer-notifications.change b/changelog.d/mobile-drawer-notifications.change deleted file mode 100644 index 9353c709..00000000 --- a/changelog.d/mobile-drawer-notifications.change +++ /dev/null @@ -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. diff --git a/changelog.d/more-notification-types-setting.fix b/changelog.d/more-notification-types-setting.fix deleted file mode 100644 index 2d71b599..00000000 --- a/changelog.d/more-notification-types-setting.fix +++ /dev/null @@ -1 +0,0 @@ -Fixed being unable to set notification visibility for reports and follow requests diff --git a/changelog.d/multiple-status-mute-reasons.fix b/changelog.d/multiple-status-mute-reasons.fix new file mode 100644 index 00000000..952ccea8 --- /dev/null +++ b/changelog.d/multiple-status-mute-reasons.fix @@ -0,0 +1 @@ +Fix whitespaces for multiple status mute reasons, display bot status reason diff --git a/changelog.d/mute-nsfw.add b/changelog.d/mute-nsfw.add deleted file mode 100644 index b1794a0c..00000000 --- a/changelog.d/mute-nsfw.add +++ /dev/null @@ -1 +0,0 @@ -Added ability to mute sensitive posts (ported from eintei) diff --git a/changelog.d/native-filtering.add b/changelog.d/native-filtering.add deleted file mode 100644 index 82ab9a23..00000000 --- a/changelog.d/native-filtering.add +++ /dev/null @@ -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. diff --git a/changelog.d/native-notifications.add b/changelog.d/native-notifications.add deleted file mode 100644 index d896e7c0..00000000 --- a/changelog.d/native-notifications.add +++ /dev/null @@ -1 +0,0 @@ -Native notifications now also have "badge" property that matches instance's favicon (visible in Android Chromium at least) diff --git a/changelog.d/no-preserve-selection-color.fix b/changelog.d/no-preserve-selection-color.fix deleted file mode 100644 index 669e744c..00000000 --- a/changelog.d/no-preserve-selection-color.fix +++ /dev/null @@ -1 +0,0 @@ -Ensure selection text color has enough contrast diff --git a/changelog.d/non-anonymous-polls.add b/changelog.d/non-anonymous-polls.add new file mode 100644 index 00000000..9ff7f3ad --- /dev/null +++ b/changelog.d/non-anonymous-polls.add @@ -0,0 +1 @@ +Inform users that Smithereen public polls are public \ No newline at end of file diff --git a/changelog.d/non-expiring-polls-indication.fix b/changelog.d/non-expiring-polls-indication.fix deleted file mode 100644 index 7979cc13..00000000 --- a/changelog.d/non-expiring-polls-indication.fix +++ /dev/null @@ -1 +0,0 @@ -The expiry date indication won't be shown if the poll never expires diff --git a/changelog.d/noninteractive-ignore-read.add b/changelog.d/noninteractive-ignore-read.add deleted file mode 100644 index 5e8710cf..00000000 --- a/changelog.d/noninteractive-ignore-read.add +++ /dev/null @@ -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) diff --git a/changelog.d/notif-types.fix b/changelog.d/notif-types.fix deleted file mode 100644 index fb0e5046..00000000 --- a/changelog.d/notif-types.fix +++ /dev/null @@ -1 +0,0 @@ -Synchronized requested notification types with backend, hopefully should fix missing notifications for polls and follow requests diff --git a/changelog.d/notification-read.add b/changelog.d/notification-read.add deleted file mode 100644 index e5027a95..00000000 --- a/changelog.d/notification-read.add +++ /dev/null @@ -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. diff --git a/changelog.d/notifications-sorting.change b/changelog.d/notifications-sorting.change deleted file mode 100644 index 3a616244..00000000 --- a/changelog.d/notifications-sorting.change +++ /dev/null @@ -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. diff --git a/changelog.d/oauth-app-name.change b/changelog.d/oauth-app-name.change new file mode 100644 index 00000000..15d6f87e --- /dev/null +++ b/changelog.d/oauth-app-name.change @@ -0,0 +1 @@ +Simplify the OAuth client_name to 'PleromaFE' diff --git a/changelog.d/panel-stack.fix b/changelog.d/panel-stack.fix new file mode 100644 index 00000000..518ff32f --- /dev/null +++ b/changelog.d/panel-stack.fix @@ -0,0 +1 @@ +proper sticky header for conversations on user page diff --git a/changelog.d/piss-fix.skip b/changelog.d/piss-fix.skip new file mode 100644 index 00000000..e69de29b diff --git a/changelog.d/piss-serialization.skip b/changelog.d/piss-serialization.skip new file mode 100644 index 00000000..e69de29b diff --git a/changelog.d/poll-ended-notifications.fix b/changelog.d/poll-ended-notifications.fix deleted file mode 100644 index d04b8cb0..00000000 --- a/changelog.d/poll-ended-notifications.fix +++ /dev/null @@ -1 +0,0 @@ -Add poll end notifications to fetched types. diff --git a/changelog.d/preview-interference.skip b/changelog.d/preview-interference.skip deleted file mode 100644 index e32e76dd..00000000 --- a/changelog.d/preview-interference.skip +++ /dev/null @@ -1 +0,0 @@ -skip diff --git a/changelog.d/profile-mentions.fix b/changelog.d/profile-mentions.fix deleted file mode 100644 index 3f38ab0c..00000000 --- a/changelog.d/profile-mentions.fix +++ /dev/null @@ -1 +0,0 @@ -Fix profile mentions causing a 422 error diff --git a/changelog.d/public-favorites.add b/changelog.d/public-favorites.add deleted file mode 100644 index 183fcc85..00000000 --- a/changelog.d/public-favorites.add +++ /dev/null @@ -1 +0,0 @@ -Display public favorites on user profiles \ No newline at end of file diff --git a/changelog.d/quote-buttons.fix b/changelog.d/quote-buttons.fix new file mode 100644 index 00000000..859e5d6c --- /dev/null +++ b/changelog.d/quote-buttons.fix @@ -0,0 +1 @@ +reply-or-quote buttons now take less space diff --git a/changelog.d/quotes-count.add b/changelog.d/quotes-count.add deleted file mode 100644 index 86779b96..00000000 --- a/changelog.d/quotes-count.add +++ /dev/null @@ -1 +0,0 @@ -Display quotes count on posts and add quotes list page \ No newline at end of file diff --git a/changelog.d/registration-notice.add b/changelog.d/registration-notice.add deleted file mode 100644 index b2777ba2..00000000 --- a/changelog.d/registration-notice.add +++ /dev/null @@ -1 +0,0 @@ -Show a dedicated registration notice page when further action is required after registering diff --git a/changelog.d/scrobbles-age-filter.add b/changelog.d/scrobbles-age-filter.add deleted file mode 100644 index ecd3c7d8..00000000 --- a/changelog.d/scrobbles-age-filter.add +++ /dev/null @@ -1 +0,0 @@ -Option to only show scrobbles that are recent enough diff --git a/changelog.d/serviceworkers.change b/changelog.d/serviceworkers.change deleted file mode 100644 index b3b64f6d..00000000 --- a/changelog.d/serviceworkers.change +++ /dev/null @@ -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. diff --git a/changelog.d/show-bookmarks-on-mobile.fix b/changelog.d/show-bookmarks-on-mobile.fix new file mode 100644 index 00000000..3b5db483 --- /dev/null +++ b/changelog.d/show-bookmarks-on-mobile.fix @@ -0,0 +1 @@ +Bookmarks visible again on mobile diff --git a/changelog.d/show-recent-scrobble.skip b/changelog.d/show-recent-scrobble.skip deleted file mode 100644 index 9227de06..00000000 --- a/changelog.d/show-recent-scrobble.skip +++ /dev/null @@ -1 +0,0 @@ -Shows the most recent scrobble under each post when available diff --git a/changelog.d/splashfix.skip b/changelog.d/splashfix.skip new file mode 100644 index 00000000..e69de29b diff --git a/changelog.d/splashscreen.add b/changelog.d/splashscreen.add new file mode 100644 index 00000000..f1f56551 --- /dev/null +++ b/changelog.d/splashscreen.add @@ -0,0 +1 @@ +Splash screen + loading indicator to make process of identifying initialization issues and load performance diff --git a/changelog.d/status-loading-indicator.add b/changelog.d/status-loading-indicator.add deleted file mode 100644 index d0725677..00000000 --- a/changelog.d/status-loading-indicator.add +++ /dev/null @@ -1 +0,0 @@ -Display loading and error indicator for conversation page diff --git a/changelog.d/status-notification-type.add b/changelog.d/status-notification-type.add deleted file mode 100644 index 0917dad4..00000000 --- a/changelog.d/status-notification-type.add +++ /dev/null @@ -1 +0,0 @@ -Support `status` notification type \ No newline at end of file diff --git a/changelog.d/tabs.change b/changelog.d/tabs.change new file mode 100644 index 00000000..e716ad42 --- /dev/null +++ b/changelog.d/tabs.change @@ -0,0 +1 @@ +Tabs now have indentation for better visibility of which tab is currently active diff --git a/changelog.d/theme-selector.add b/changelog.d/theme-selector.add deleted file mode 100644 index c303f97c..00000000 --- a/changelog.d/theme-selector.add +++ /dev/null @@ -1 +0,0 @@ -Theme selector with visual previews of the theme diff --git a/changelog.d/themes3-cache.add b/changelog.d/themes3-cache.add deleted file mode 100644 index a275e44c..00000000 --- a/changelog.d/themes3-cache.add +++ /dev/null @@ -1 +0,0 @@ -Add caching system for themes3 diff --git a/changelog.d/themes3-fixes.fix b/changelog.d/themes3-fixes.fix deleted file mode 100644 index 15c31e82..00000000 --- a/changelog.d/themes3-fixes.fix +++ /dev/null @@ -1 +0,0 @@ -fix color inputs and some in-development themes3 issues diff --git a/changelog.d/themes3.add b/changelog.d/themes3.add new file mode 100644 index 00000000..040957ce --- /dev/null +++ b/changelog.d/themes3.add @@ -0,0 +1 @@ +UI for making v3 themes and palettes, support for bundling v3 themes diff --git a/changelog.d/themes3.change b/changelog.d/themes3.change deleted file mode 100644 index 5255f9b1..00000000 --- a/changelog.d/themes3.change +++ /dev/null @@ -1 +0,0 @@ -Overhauled the way themes work, migrating to new Pleroma Interface Style Sheets system. diff --git a/changelog.d/themesv3-on-safari.fix b/changelog.d/themesv3-on-safari.fix deleted file mode 100644 index af767b3a..00000000 --- a/changelog.d/themesv3-on-safari.fix +++ /dev/null @@ -1 +0,0 @@ -Fix Themes v3 on Safari not working diff --git a/changelog.d/ui-scale.add b/changelog.d/ui-scale.add deleted file mode 100644 index 594a9aa5..00000000 --- a/changelog.d/ui-scale.add +++ /dev/null @@ -1 +0,0 @@ -Ability to resize UI (and certain components) scale independent of browser/text scale diff --git a/changelog.d/unreads-sync.fix b/changelog.d/unreads-sync.fix deleted file mode 100644 index 1eac3364..00000000 --- a/changelog.d/unreads-sync.fix +++ /dev/null @@ -1 +0,0 @@ -unread notifications should now properly catch up (eventually) in polling mode diff --git a/changelog.d/user-link.add b/changelog.d/user-link.add new file mode 100644 index 00000000..ca65aa5f --- /dev/null +++ b/changelog.d/user-link.add @@ -0,0 +1 @@ +Make UserLink wrappable diff --git a/changelog.d/user-overrides.add b/changelog.d/user-overrides.add deleted file mode 100644 index c0cb839a..00000000 --- a/changelog.d/user-overrides.add +++ /dev/null @@ -1 +0,0 @@ -Ability to override certain aspects of UI style independent of theme used (UI roundness, fonts, underlay) diff --git a/changelog.d/video-poster.fix b/changelog.d/video-poster.fix deleted file mode 100644 index 43e95f6e..00000000 --- a/changelog.d/video-poster.fix +++ /dev/null @@ -1 +0,0 @@ -Video posters on Safari diff --git a/changelog.d/video-poster.update.skip b/changelog.d/video-poster.update.skip deleted file mode 100644 index 9dafe9be..00000000 --- a/changelog.d/video-poster.update.skip +++ /dev/null @@ -1 +0,0 @@ -nothing diff --git a/changelog.d/web-push-always.add b/changelog.d/web-push-always.add deleted file mode 100644 index f8b8888a..00000000 --- a/changelog.d/web-push-always.add +++ /dev/null @@ -1 +0,0 @@ -Added option to always "show" notifications when using web push for better compatibility with some browsers (chrome, edge, safari) diff --git a/changelog.d/weird-absolute-time-format.fix b/changelog.d/weird-absolute-time-format.fix new file mode 100644 index 00000000..727d5876 --- /dev/null +++ b/changelog.d/weird-absolute-time-format.fix @@ -0,0 +1 @@ +Show only month and day instead of weird "day, hour" format. While at it, fixed typo "defualt" in a comment. \ No newline at end of file diff --git a/index.html b/index.html index 6d9c4ce5..63f071aa 100644 --- a/index.html +++ b/index.html @@ -3,14 +3,163 @@ - + + - + -
+
+ + +
+ +
+ + + +
+ +

+      
+
+
diff --git a/package.json b/package.json index fb157fae..fa08593f 100644 --- a/package.json +++ b/package.json @@ -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 ", "private": false, @@ -24,7 +24,7 @@ "@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.2024.3.17", + "@ruffle-rs/ruffle": "0.1.0-nightly.2024.8.21", "@vuelidate/core": "2.0.3", "@vuelidate/validators": "2.0.4", "body-scroll-lock": "3.1.5", @@ -35,6 +35,7 @@ "hash-sum": "^2.0.0", "js-cookie": "3.0.5", "localforage": "1.10.0", + "pako": "^2.1.0", "parse-link-header": "2.0.0", "phoenix": "1.7.7", "punycode.js": "2.3.0", @@ -58,7 +59,7 @@ "@intlify/vue-i18n-loader": "5.0.1", "@ungap/event-target": "0.2.4", "@vue/babel-helper-vue-jsx-merge-props": "1.4.0", - "@vue/babel-plugin-jsx": "1.2.1", + "@vue/babel-plugin-jsx": "1.2.2", "@vue/compiler-sfc": "3.2.45", "@vue/test-utils": "2.2.8", "autoprefixer": "10.4.19", @@ -88,9 +89,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", @@ -132,5 +133,6 @@ "engines": { "node": ">= 16.0.0", "npm": ">= 3.0.0" - } + }, + "packageManager": "yarn@1.22.22+sha512.a6b2f7906b721bba3d67d4aff083df04dad64c399707841b7acf00f6b133b7ac24255f2652fa22ae3534329dc6180534e98d17432037ff6fd140556e2bb3137e" } diff --git a/src/App.js b/src/App.js index b7eb2f72..befcece8 100644 --- a/src/App.js +++ b/src/App.js @@ -44,16 +44,32 @@ 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 + }, + layoutModalClass () { + return '-' + this.layoutType + }, classes () { return [ { @@ -130,6 +146,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') } } } diff --git a/src/App.scss b/src/App.scss index 67e40540..2afc4390 100644 --- a/src/App.scss +++ b/src/App.scss @@ -920,3 +920,169 @@ option { 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; + } + } + } +} diff --git a/src/App.vue b/src/App.vue index 9d7ad912..762e1851 100644 --- a/src/App.vue +++ b/src/App.vue @@ -70,7 +70,7 @@ - +
diff --git a/src/assets/pleromatan_apology.png b/src/assets/pleromatan_apology.png deleted file mode 100644 index 36ad7aeb..00000000 Binary files a/src/assets/pleromatan_apology.png and /dev/null differ diff --git a/src/assets/pleromatan_apology.png b/src/assets/pleromatan_apology.png new file mode 120000 index 00000000..a7f6191f --- /dev/null +++ b/src/assets/pleromatan_apology.png @@ -0,0 +1 @@ +../../static/pleromatan_apology.png \ No newline at end of file diff --git a/src/assets/pleromatan_apology_fox.png b/src/assets/pleromatan_apology_fox.png deleted file mode 100644 index 17f87694..00000000 Binary files a/src/assets/pleromatan_apology_fox.png and /dev/null differ diff --git a/src/assets/pleromatan_apology_fox.png b/src/assets/pleromatan_apology_fox.png new file mode 120000 index 00000000..b3db4af3 --- /dev/null +++ b/src/assets/pleromatan_apology_fox.png @@ -0,0 +1 @@ +../../static/pleromatan_apology_fox.png \ No newline at end of file diff --git a/src/boot/after_store.js b/src/boot/after_store.js index a334662e..cf242092 100644 --- a/src/boot/after_store.js +++ b/src/boot/after_store.js @@ -122,6 +122,9 @@ const setSettings = async ({ apiConfig, staticConfig, store }) => { store.dispatch('setInstanceOption', { name, value: config[name] }) } + copyInstanceOption('theme') + copyInstanceOption('style') + copyInstanceOption('palette') copyInstanceOption('nsfwCensorImage') copyInstanceOption('background') copyInstanceOption('hidePostStats') @@ -240,7 +243,7 @@ const resolveStaffAccounts = ({ store, accounts }) => { const getNodeInfo = async ({ store }) => { try { - const res = await preloadFetch('/nodeinfo/2.0.json') + const res = await preloadFetch('/nodeinfo/2.1.json') if (res.ok) { const data = await res.json() const metadata = data.metadata @@ -252,6 +255,7 @@ 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') }) @@ -276,6 +280,7 @@ const getNodeInfo = async ({ store }) => { const software = data.software store.dispatch('setInstanceOption', { name: 'backendVersion', value: software.version }) + store.dispatch('setInstanceOption', { name: 'backendRepository', value: software.repository }) store.dispatch('setInstanceOption', { name: 'pleromaBackend', value: software.name === 'pleroma' }) const priv = metadata.private @@ -326,11 +331,7 @@ const setConfig = async ({ store }) => { const checkOAuthToken = async ({ store }) => { if (store.getters.getUserToken()) { - try { - await store.dispatch('loginUser', store.getters.getUserToken()) - } catch (e) { - console.error(e) - } + return store.dispatch('loginUser', store.getters.getUserToken()) } return Promise.resolve() } @@ -349,9 +350,14 @@ const afterStoreSetup = async ({ store, i18n }) => { store.dispatch('setInstanceOption', { name: 'server', value: server }) await setConfig({ store }) - await store.dispatch('setTheme') + try { + await store.dispatch('applyTheme').catch((e) => { console.error('Error setting theme', e) }) + } catch (e) { + window.splashError(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 @@ -360,7 +366,7 @@ const afterStoreSetup = async ({ store, i18n }) => { getInstancePanel({ store }), getNodeInfo({ store }), getInstanceConfig({ store }) - ]) + ]).catch(e => Promise.reject(e)) await store.dispatch('loadDrafts') @@ -387,6 +393,13 @@ const afterStoreSetup = async ({ store, i18n }) => { app.use(store) app.use(i18n) + // Little thing to get out of invalid theme state + window.resetThemes = () => { + store.dispatch('resetThemeV3') + store.dispatch('resetThemeV3Palette') + store.dispatch('resetThemeV2') + } + app.use(vClickOutside) app.use(VBodyScrollLock) app.use(VueVirtualScroller) @@ -398,7 +411,6 @@ const afterStoreSetup = async ({ store, i18n }) => { app.config.unwrapInjectedRef = true app.mount('#app') - return app } diff --git a/src/boot/routes.js b/src/boot/routes.js index fe076172..66d937c8 100644 --- a/src/boot/routes.js +++ b/src/boot/routes.js @@ -27,6 +27,8 @@ 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 Drafts from 'components/drafts/drafts.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) => { @@ -88,7 +90,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) { diff --git a/src/components/account_actions/account_actions.vue b/src/components/account_actions/account_actions.vue index 9a7c6824..62862a8f 100644 --- a/src/components/account_actions/account_actions.vue +++ b/src/components/account_actions/account_actions.vue @@ -86,6 +86,7 @@ diff --git a/src/components/border.style.js b/src/components/border.style.js index a87ee9c8..7f2c3016 100644 --- a/src/components/border.style.js +++ b/src/components/border.style.js @@ -5,7 +5,7 @@ export default { defaultRules: [ { directives: { - textColor: '$mod(--parent, 10)', + textColor: '$mod(--parent 10)', textAuto: 'no-auto' } } diff --git a/src/components/button.style.js b/src/components/button.style.js index 6fec67a0..747cfd5e 100644 --- a/src/components/button.style.js +++ b/src/components/button.style.js @@ -9,9 +9,9 @@ export default { // 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', + focused: ':focus-visible', + pressed: ':focus: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. @@ -22,6 +22,9 @@ export default { // 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. }, + editor: { + aspect: '2 / 1' + }, // 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', @@ -32,10 +35,11 @@ export default { { 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)' + '--buttonDefaultHoverGlow': 'shadow | 0 0 4 --text / 0.5', + '--buttonDefaultFocusGlow': 'shadow | 0 0 4 4 --link / 0.5', + '--buttonDefaultShadow': 'shadow | 0 0 2 #000000', + '--buttonDefaultBevel': 'shadow | $borderSide(#FFFFFF top 0.2 2), $borderSide(#000000 bottom 0.2 2)', + '--buttonPressedBevel': 'shadow | $borderSide(#FFFFFF bottom 0.2 2), $borderSide(#000000 top 0.2 2)' } }, { @@ -43,47 +47,60 @@ export default { // like within it directives: { background: '--fg', - shadow: ['--defaultButtonShadow', '--defaultButtonBevel'], + shadow: ['--buttonDefaultShadow', '--buttonDefaultBevel'], roundness: 3 } }, { state: ['hover'], directives: { - shadow: ['--defaultButtonHoverGlow', '--defaultButtonBevel'] + shadow: ['--buttonDefaultHoverGlow', '--buttonDefaultBevel'] + } + }, + { + state: ['focused'], + directives: { + shadow: ['--buttonDefaultFocusGlow', '--buttonDefaultBevel'] } }, { state: ['pressed'], directives: { - shadow: ['--defaultButtonShadow', '--pressedButtonBevel'] + shadow: ['--buttonDefaultShadow', '--buttonPressedBevel'] } }, { - state: ['hover', 'pressed'], + state: ['pressed', 'hover'], directives: { - shadow: ['--defaultButtonHoverGlow', '--pressedButtonBevel'] + shadow: ['--buttonPressedBevel', '--buttonDefaultHoverGlow'] } }, { state: ['toggled'], directives: { background: '--inheritedBackground,-14.2', - shadow: ['--defaultButtonShadow', '--pressedButtonBevel'] + shadow: ['--buttonDefaultShadow', '--buttonPressedBevel'] } }, { state: ['toggled', 'hover'], directives: { background: '--inheritedBackground,-14.2', - shadow: ['--defaultButtonHoverGlow', '--pressedButtonBevel'] + shadow: ['--buttonDefaultHoverGlow', '--buttonPressedBevel'] + } + }, + { + state: ['toggled', 'disabled'], + directives: { + background: '$blend(--inheritedBackground 0.25 --parent)', + shadow: ['--buttonPressedBevel'] } }, { state: ['disabled'], directives: { - background: '$blend(--inheritedBackground, 0.25, --parent)', - shadow: ['--defaultButtonBevel'] + background: '$blend(--inheritedBackground 0.25 --parent)', + shadow: ['--buttonDefaultBevel'] } }, { @@ -96,6 +113,17 @@ export default { textOpacity: 0.25, textOpacityMode: 'blend' } + }, + { + component: 'Icon', + parent: { + component: 'Button', + state: ['disabled'] + }, + directives: { + textOpacity: 0.25, + textOpacityMode: 'blend' + } } ] } diff --git a/src/components/button_unstyled.style.js b/src/components/button_unstyled.style.js index 65b5c57b..a4f0f6f9 100644 --- a/src/components/button_unstyled.style.js +++ b/src/components/button_unstyled.style.js @@ -1,6 +1,7 @@ export default { name: 'ButtonUnstyled', selector: '.button-unstyled', + notEditable: true, states: { toggled: '.toggled', disabled: ':disabled', diff --git a/src/components/chat_list/chat_list.vue b/src/components/chat_list/chat_list.vue index b33ea67e..24bbc9f4 100644 --- a/src/components/chat_list/chat_list.vue +++ b/src/components/chat_list/chat_list.vue @@ -7,9 +7,9 @@ class="chat-list panel panel-default" >
- +

{{ $t("chats.chats") }} - +