diff --git a/CHANGELOG.md b/CHANGELOG.md index 20c9c2693..ded5c6e4d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,10 +3,6 @@ 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.9.3 -### Fixed -- Being unable to update profile - ## 2.9.2 ### Changed - BREAKING: due to some internal technical changes logging into AdminFE through PleromaFE is no longer possible diff --git a/changelog.d/broken.fix b/changelog.d/broken.fix deleted file mode 100644 index 7e58091b4..000000000 --- a/changelog.d/broken.fix +++ /dev/null @@ -1,2 +0,0 @@ -Fix display of the broken/deleted/banned users - diff --git a/changelog.d/everything-instance-default.add b/changelog.d/everything-instance-default.add deleted file mode 100644 index 6c4475905..000000000 --- a/changelog.d/everything-instance-default.add +++ /dev/null @@ -1 +0,0 @@ -Make every configuration option default-overridable by instance admins diff --git a/package.json b/package.json index 21d75f0fb..edc122760 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "pleroma_fe", - "version": "2.9.3", + "version": "2.9.2", "description": "Pleroma frontend, the default frontend of Pleroma social network server", "author": "Pleroma contributors ", "private": false, @@ -17,12 +17,12 @@ "lint-fix": "eslint --fix src test/unit/specs test/e2e/specs" }, "dependencies": { - "@babel/runtime": "7.28.4", + "@babel/runtime": "7.28.3", "@chenfengyuan/vue-qrcode": "2.0.0", - "@fortawesome/fontawesome-svg-core": "7.1.0", - "@fortawesome/free-regular-svg-icons": "7.1.0", - "@fortawesome/free-solid-svg-icons": "7.1.0", - "@fortawesome/vue-fontawesome": "3.1.2", + "@fortawesome/fontawesome-svg-core": "6.7.2", + "@fortawesome/free-regular-svg-icons": "6.7.2", + "@fortawesome/free-solid-svg-icons": "6.7.2", + "@fortawesome/vue-fontawesome": "3.1.1", "@kazvmoe-infra/pinch-zoom-element": "1.3.0", "@kazvmoe-infra/unicode-emoji-json": "0.4.0", "@ruffle-rs/ruffle": "0.1.0-nightly.2025.6.22", @@ -39,7 +39,7 @@ "js-cookie": "3.0.5", "localforage": "1.10.0", "parse-link-header": "2.0.0", - "phoenix": "1.8.1", + "phoenix": "1.8.0", "pinia": "^3.0.0", "punycode.js": "2.3.1", "qrcode": "1.5.4", @@ -47,15 +47,15 @@ "url": "0.11.4", "utf8": "3.0.0", "uuid": "11.1.0", - "vue": "3.5.22", + "vue": "3.5.19", "vue-i18n": "11", "vue-router": "4.5.1", "vue-virtual-scroller": "^2.0.0-beta.7", "vuex": "4.1.0" }, "devDependencies": { - "@babel/core": "7.28.4", - "@babel/eslint-parser": "7.28.4", + "@babel/core": "7.28.3", + "@babel/eslint-parser": "7.28.0", "@babel/plugin-transform-runtime": "7.28.3", "@babel/preset-env": "7.28.3", "@babel/register": "7.28.3", @@ -66,24 +66,24 @@ "@vitest/ui": "^3.0.7", "@vue/babel-helper-vue-jsx-merge-props": "1.4.0", "@vue/babel-plugin-jsx": "1.5.0", - "@vue/compiler-sfc": "3.5.22", + "@vue/compiler-sfc": "3.5.19", "@vue/test-utils": "2.4.6", "autoprefixer": "10.4.21", "babel-plugin-lodash": "3.3.4", - "chai": "5.3.3", - "chalk": "5.6.2", + "chai": "5.3.2", + "chalk": "5.6.0", "chromedriver": "135.0.4", "connect-history-api-fallback": "2.0.0", "cross-spawn": "7.0.6", "custom-event-polyfill": "1.0.7", - "eslint": "9.37.0", + "eslint": "9.33.0", "vue-eslint-parser": "10.2.0", "eslint-config-standard": "17.1.0", "eslint-formatter-friendly": "7.0.0", "eslint-plugin-import": "2.32.0", - "eslint-plugin-n": "17.23.1", + "eslint-plugin-n": "17.21.3", "eslint-plugin-promise": "7.2.1", - "eslint-plugin-vue": "10.5.0", + "eslint-plugin-vue": "10.4.0", "eventsource-polyfill": "0.9.6", "express": "5.1.0", "function-bind": "1.1.2", @@ -96,14 +96,14 @@ "postcss": "8.5.6", "postcss-html": "^1.5.0", "postcss-scss": "^4.0.6", - "sass": "1.93.2", + "sass": "1.89.2", "selenium-server": "3.141.59", - "semver": "7.7.3", + "semver": "7.7.2", "serve-static": "2.2.0", "shelljs": "0.10.0", "sinon": "20.0.0", - "sinon-chai": "4.0.1", - "stylelint": "16.25.0", + "sinon-chai": "4.0.0", + "stylelint": "16.19.1", "stylelint-config-html": "^1.1.0", "stylelint-config-recommended": "^16.0.0", "stylelint-config-recommended-scss": "^14.0.0", diff --git a/src/boot/after_store.js b/src/boot/after_store.js index ad994af6a..fd4c57229 100644 --- a/src/boot/after_store.js +++ b/src/boot/after_store.js @@ -24,7 +24,6 @@ import { useI18nStore } from 'src/stores/i18n' import { useInterfaceStore } from 'src/stores/interface' import { useAnnouncementsStore } from 'src/stores/announcements' import { useAuthFlowStore } from 'src/stores/auth_flow' -import { staticOrApiConfigDefault, instanceDefaultConfig } from 'src/modules/default_config_state.js' let staticInitialResults = null @@ -131,15 +130,50 @@ const setSettings = async ({ apiConfig, staticConfig, store }) => { } const copyInstanceOption = (name) => { - if (typeof config[name] !== 'undefined') { - store.dispatch('setInstanceOption', { name, value: config[name] }) - } + store.dispatch('setInstanceOption', { name, value: config[name] }) } - Object.keys(staticOrApiConfigDefault).forEach(copyInstanceOption) - Object.keys(instanceDefaultConfig).forEach(copyInstanceOption) + copyInstanceOption('theme') + copyInstanceOption('style') + copyInstanceOption('palette') + copyInstanceOption('embeddedToS') + copyInstanceOption('nsfwCensorImage') + copyInstanceOption('background') + copyInstanceOption('hidePostStats') + copyInstanceOption('hideBotIndication') + copyInstanceOption('hideUserStats') + copyInstanceOption('hideFilteredStatuses') + copyInstanceOption('logo') + store.dispatch('setInstanceOption', { + name: 'logoMask', + value: typeof config.logoMask === 'undefined' + ? true + : config.logoMask + }) + + store.dispatch('setInstanceOption', { + name: 'logoMargin', + value: typeof config.logoMargin === 'undefined' + ? 0 + : config.logoMargin + }) + copyInstanceOption('logoLeft') useAuthFlowStore().setInitialStrategy(config.loginMethod) + + copyInstanceOption('redirectRootNoLogin') + copyInstanceOption('redirectRootLogin') + copyInstanceOption('showInstanceSpecificPanel') + copyInstanceOption('minimalScopesMode') + copyInstanceOption('hideMutedPosts') + copyInstanceOption('collapseMessageWithSubject') + copyInstanceOption('scopeCopy') + copyInstanceOption('subjectLineBehavior') + copyInstanceOption('postContentType') + copyInstanceOption('alwaysShowSubjectInput') + copyInstanceOption('showFeaturesPanel') + copyInstanceOption('hideSitename') + copyInstanceOption('sidebarRight') } const getTOS = async ({ store }) => { diff --git a/src/components/exporter/exporter.vue b/src/components/exporter/exporter.vue index e36d9dd62..79defdf6f 100644 --- a/src/components/exporter/exporter.vue +++ b/src/components/exporter/exporter.vue @@ -23,9 +23,6 @@ diff --git a/src/components/settings_modal/settings_modal.scss b/src/components/settings_modal/settings_modal.scss index a1e3ec412..2c975917f 100644 --- a/src/components/settings_modal/settings_modal.scss +++ b/src/components/settings_modal/settings_modal.scss @@ -1,48 +1,21 @@ .settings-modal { overflow: hidden; - h2 { - font-size: 1.3rem; - font-weight: 500; - margin-top: 1em; - margin-bottom: 1em; - } - - h3 { - font-size: 1.2rem; - font-weight: 500; - margin-top: 1em; - margin-bottom: 0.5em; - border-bottom: 1px solid var(--border); - padding-bottom: 0.25em; - box-sizing: border-box; - padding-left: 0.5em; - } - h4 { - font-size: 1.1rem; - margin-top: 1em; margin-bottom: 0.5em; } - h5 { - font-size: 1rem; - margin-bottom: 0.5em; - margin-top: 0; - } - .setting-list, .option-list { list-style-type: none; padding-left: 2em; - margin: 0; .btn:not(.dropdown-button) { padding: 0 2em; } li { - margin: 1em 0; + margin-bottom: 0.5em; } .suboptions { @@ -69,7 +42,7 @@ transition: transform; transition-timing-function: ease-in-out; transition-duration: 300ms; - width: 70em; + width: 1000px; max-width: 90vw; height: 90vh; @@ -104,12 +77,6 @@ } &.-mobile { - .tabs { - .menu-item { - font-size: 1.2em - } - } - .setting-list, .option-list { padding-left: 0.25em; diff --git a/src/components/settings_modal/settings_modal_admin_content.js b/src/components/settings_modal/settings_modal_admin_content.js index fa6b7f8ad..593318ec4 100644 --- a/src/components/settings_modal/settings_modal_admin_content.js +++ b/src/components/settings_modal/settings_modal_admin_content.js @@ -1,4 +1,4 @@ -import VerticalTabSwitcher from 'src/components/tab_switcher/vertical_tab_switcher.jsx' +import TabSwitcher from 'src/components/tab_switcher/tab_switcher.jsx' import InstanceTab from './admin_tabs/instance_tab.vue' import LimitsTab from './admin_tabs/limits_tab.vue' @@ -31,7 +31,7 @@ library.add( const SettingsModalAdminContent = { components: { - VerticalTabSwitcher, + TabSwitcher, InstanceTab, LimitsTab, diff --git a/src/components/settings_modal/settings_modal_admin_content.vue b/src/components/settings_modal/settings_modal_admin_content.vue index 501a3acf6..39ef74f64 100644 --- a/src/components/settings_modal/settings_modal_admin_content.vue +++ b/src/components/settings_modal/settings_modal_admin_content.vue @@ -1,5 +1,5 @@ diff --git a/src/components/settings_modal/settings_modal_user_content.js b/src/components/settings_modal/settings_modal_user_content.js index 18e1148dc..c46b477d8 100644 --- a/src/components/settings_modal/settings_modal_user_content.js +++ b/src/components/settings_modal/settings_modal_user_content.js @@ -1,4 +1,4 @@ -import VerticalTabSwitcher from 'src/components/tab_switcher/vertical_tab_switcher.jsx' +import TabSwitcher from 'src/components/tab_switcher/tab_switcher.jsx' import DataImportExportTab from './tabs/data_import_export_tab.vue' import MutesAndBlocksTab from './tabs/mutes_and_blocks_tab.vue' @@ -7,20 +7,15 @@ import FilteringTab from './tabs/filtering_tab.vue' import SecurityTab from './tabs/security_tab/security_tab.vue' import ProfileTab from './tabs/profile_tab.vue' import GeneralTab from './tabs/general_tab.vue' -import PostsTab from './tabs/posts_tab.vue' -import ComposingTab from './tabs/composing_tab.vue' -import ClutterTab from './tabs/clutter_tab.vue' -import LayoutTab from './tabs/layout_tab.vue' import AppearanceTab from './tabs/appearance_tab.vue' -import DeveloperTab from './tabs/developer_tab.vue' -import OldThemeTab from './tabs/old_theme_tab/old_theme_tab.vue' +import VersionTab from './tabs/version_tab.vue' +import ThemeTab from './tabs/theme_tab/theme_tab.vue' import StyleTab from './tabs/style_tab/style_tab.vue' import { library } from '@fortawesome/fontawesome-svg-core' import { faWrench, faUser, - faMessage, faFilter, faPaintBrush, faPalette, @@ -28,16 +23,13 @@ import { faDownload, faEyeSlash, faInfo, - faWindowRestore, - faCode, - faBroom + faWindowRestore } from '@fortawesome/free-solid-svg-icons' import { useInterfaceStore } from 'src/stores/interface' library.add( faWrench, faUser, - faMessage, faFilter, faPaintBrush, faPalette, @@ -45,14 +37,12 @@ library.add( faDownload, faEyeSlash, faInfo, - faWindowRestore, - faBroom, - faCode + faWindowRestore ) const SettingsModalContent = { components: { - VerticalTabSwitcher, + TabSwitcher, DataImportExportTab, MutesAndBlocksTab, @@ -61,14 +51,10 @@ const SettingsModalContent = { SecurityTab, ProfileTab, GeneralTab, - PostsTab, - ComposingTab, - ClutterTab, - LayoutTab, AppearanceTab, StyleTab, - DeveloperTab, - OldThemeTab + VersionTab, + ThemeTab }, computed: { isLoggedIn () { @@ -82,12 +68,9 @@ const SettingsModalContent = { }, expertLevel () { return this.$store.state.config.expertLevel - } - }, - data () { - return { - navCollapsed: false, - navHideHeader: false + }, + isMobileLayout () { + return useInterfaceStore().layoutType === 'mobile' } }, methods: { diff --git a/src/components/settings_modal/settings_modal_user_content.scss b/src/components/settings_modal/settings_modal_user_content.scss index 5deca7868..25e9bda3a 100644 --- a/src/components/settings_modal/settings_modal_user_content.scss +++ b/src/components/settings_modal/settings_modal_user_content.scss @@ -1,6 +1,21 @@ .settings_tab-switcher { height: 100%; + h1 { + margin-bottom: 0.5em; + margin-top: 0.5em; + } + + h4 { + margin-bottom: 0; + margin-top: 0.25em; + } + + h5 { + margin-bottom: 0; + margin-top: 0.25em; + } + .setting-item { border-bottom: 2px solid var(--border); margin: 1em 1em 1.4em; diff --git a/src/components/settings_modal/settings_modal_user_content.vue b/src/components/settings_modal/settings_modal_user_content.vue index 6709b6e02..f9a1e99bc 100644 --- a/src/components/settings_modal/settings_modal_user_content.vue +++ b/src/components/settings_modal/settings_modal_user_content.vue @@ -1,11 +1,10 @@ diff --git a/src/components/settings_modal/tabs/appearance_tab.js b/src/components/settings_modal/tabs/appearance_tab.js index 3bb5ec508..7fbb0a5cd 100644 --- a/src/components/settings_modal/tabs/appearance_tab.js +++ b/src/components/settings_modal/tabs/appearance_tab.js @@ -1,12 +1,12 @@ -import VerticalTabSwitcher from 'src/components/tab_switcher/vertical_tab_switcher.jsx' - import BooleanSetting from '../helpers/boolean_setting.vue' import ChoiceSetting from '../helpers/choice_setting.vue' import IntegerSetting from '../helpers/integer_setting.vue' import FloatSetting from '../helpers/float_setting.vue' import UnitSetting from '../helpers/unit_setting.vue' +import { defaultHorizontalUnits } from '../helpers/unit_setting.js' import PaletteEditor from 'src/components/palette_editor/palette_editor.vue' -import Preview from './old_theme_tab/theme_preview.vue' +import Preview from './theme_tab/theme_preview.vue' +import FontControl from 'src/components/font_control/font_control.vue' import { newImporter } from 'src/services/export_import/export_import.js' import { convertTheme2To3 } from 'src/services/theme_data/theme2_to_theme3.js' @@ -26,17 +26,11 @@ import { useInterfaceStore, normalizeThemeData } from 'src/stores/interface' import { library } from '@fortawesome/fontawesome-svg-core' import { - faGlobe, - faDashboard, - faPaintRoller, - faTableColumns + faGlobe } from '@fortawesome/free-solid-svg-icons' library.add( - faGlobe, - faPaintRoller, - faDashboard, - faTableColumns + faGlobe ) const AppearanceTab = { @@ -65,6 +59,11 @@ const AppearanceTab = { ], userPalette: {}, intersectionObserver: null, + thirdColumnModeOptions: ['none', 'notifications', 'postform'].map(mode => ({ + key: mode, + value: mode, + label: this.$t(`settings.third_column_mode_${mode}`) + })), forcedRoundnessOptions: ['disabled', 'sharp', 'nonsharp', 'round'].map((mode, i) => ({ key: mode, value: i - 1, @@ -87,9 +86,9 @@ const AppearanceTab = { FloatSetting, UnitSetting, ProfileSettingIndicator, + FontControl, Preview, - PaletteEditor, - VerticalTabSwitcher + PaletteEditor }, mounted () { useInterfaceStore().getThemeData() @@ -254,10 +253,33 @@ const AppearanceTab = { noIntersectionObserver () { return !window.IntersectionObserver }, + horizontalUnits () { + return defaultHorizontalUnits + }, + fontsOverride () { + return this.$store.getters.mergedConfig.fontsOverride + }, + columns () { + const mode = this.$store.getters.mergedConfig.thirdColumnMode + + const notif = mode === 'none' ? [] : ['notifs'] + + if (this.$store.getters.mergedConfig.sidebarRight || mode === 'postform') { + return [...notif, 'content', 'sidebar'] + } else { + return ['sidebar', 'content', ...notif] + } + }, instanceWallpaperUsed () { return this.$store.state.instance.background && !this.$store.state.users.currentUser.background_image }, + language: { + get: function () { return this.$store.getters.mergedConfig.interfaceLanguage }, + set: function (val) { + this.$store.dispatch('setOption', { name: 'interfaceLanguage', value: val }) + } + }, customThemeVersion () { const { themeVersion } = useInterfaceStore() return themeVersion @@ -273,6 +295,18 @@ const AppearanceTab = { ...SharedComputedObject() }, methods: { + updateFont (key, value) { + this.$store.dispatch('setOption', { + name: 'theme3hacks', + value: { + ...this.mergedConfig.theme3hacks, + fonts: { + ...this.mergedConfig.theme3hacks.fonts, + [key]: value + } + } + }) + }, importFile () { this.fileImporter.importData() }, diff --git a/src/components/settings_modal/tabs/appearance_tab.scss b/src/components/settings_modal/tabs/appearance_tab.scss index 58ec1e8aa..d786cfa38 100644 --- a/src/components/settings_modal/tabs/appearance_tab.scss +++ b/src/components/settings_modal/tabs/appearance_tab.scss @@ -1,19 +1,28 @@ .appearance-tab { - h3 { - border: none - } - .palette, .theme-notice { padding: 0.5em; margin: 1em; } - .theme-name { - font-weight: 900; - padding-bottom: 0.5em; + .setting-item { + padding-bottom: 0; + + &.heading { + display: grid; + align-items: baseline; + grid-template-columns: 1fr auto auto auto; + grid-gap: 0.5em; + + h2 { + flex: 1 0 auto; + } + } } + h4 { + margin: 0.5em 0; + } input[type="file"] { padding: 0.25em; @@ -62,7 +71,6 @@ border-radius: var(--roundness); border: 1px solid var(--border); margin: -0.5em; - margin-top: 0; } .palettes { @@ -72,9 +80,9 @@ padding: 0.5em; width: 100%; - h5 { + h4 { + margin: 0; grid-column: 1 / span 2; - margin-bottom: 0; } } @@ -152,7 +160,7 @@ .theme-preview { font-size: 1rem; // fix for firefox - width: 14rem; + width: 19rem; display: flex; flex-direction: column; align-items: center; diff --git a/src/components/settings_modal/tabs/appearance_tab.vue b/src/components/settings_modal/tabs/appearance_tab.vue index 868fb8bfa..cd54e2c82 100644 --- a/src/components/settings_modal/tabs/appearance_tab.vue +++ b/src/components/settings_modal/tabs/appearance_tab.vue @@ -1,15 +1,10 @@