diff --git a/package.json b/package.json index 403a2b231..fa08593f0 100644 --- a/package.json +++ b/package.json @@ -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", diff --git a/src/components/attachment/attachment.style.js b/src/components/attachment/attachment.style.js index 5fb4701c3..fde8a50a6 100644 --- a/src/components/attachment/attachment.style.js +++ b/src/components/attachment/attachment.style.js @@ -1,6 +1,7 @@ export default { name: 'Attachment', selector: '.Attachment', + notEditable: true, validInnerComponents: [ 'Border', 'ButtonUnstyled', diff --git a/src/components/palette_editor/palette_editor.vue b/src/components/palette_editor/palette_editor.vue index 9dd8d8683..be5dee448 100644 --- a/src/components/palette_editor/palette_editor.vue +++ b/src/components/palette_editor/palette_editor.vue @@ -1,5 +1,8 @@ @@ -43,12 +53,34 @@ library.add( faFileExport ) -const props = defineProps(['modelValue']) -const emit = defineEmits(['update:modelValue']) +const paletteKeys = [ + 'bg', + 'fg', + 'text', + 'link', + 'accent', + 'cRed', + 'cBlue', + 'cGreen', + 'cOrange', + 'wallpaper' +] + +const props = defineProps(['modelValue', 'compact', 'apply']) +const emit = defineEmits(['update:modelValue', 'applyPalette']) +const getExportedObject = () => paletteKeys.reduce((acc, key) => { + const value = props.modelValue[key] + if (value == null) { + return acc + } else { + return { ...acc, [key]: props.modelValue[key] } + } +}, {}) + const paletteExporter = newExporter({ filename: 'pleroma_palette', extension: 'json', - getExportedObject: () => props.modelValue + getExportedObject }) const paletteImporter = newImporter({ accept: '.json', @@ -65,18 +97,9 @@ const importPalette = () => { paletteImporter.importData() } -const paletteKeys = [ - 'bg', - 'fg', - 'text', - 'link', - 'accent', - 'cRed', - 'cBlue', - 'cGreen', - 'cOrange', - 'wallpaper' -] +const applyPalette = (data) => { + emit('applyPalette', getExportedObject()) +} const fallback = (key) => { if (key === 'accent') { @@ -118,8 +141,33 @@ const updatePalette = (paletteKey, value) => { grid-column: 3 / span 2; } + .palette-apply-button { + grid-column: 1 / span 2; + } + .color-input.style-control { margin: 0; } + + &.-compact { + grid-template-columns: repeat(2, 1fr); + grid-template-rows: repeat(5, 1fr) auto; + + .palette-import-button { + grid-column: 1; + } + + .palette-export-button { + grid-column: 2; + } + + &.-apply { + grid-template-rows: repeat(5, 1fr) auto auto; + + .palette-apply-button { + grid-column: 1 / span 2; + } + } + } } diff --git a/src/components/rich_content/rich_content.style.js b/src/components/rich_content/rich_content.style.js index c83140003..d9cd17aee 100644 --- a/src/components/rich_content/rich_content.style.js +++ b/src/components/rich_content/rich_content.style.js @@ -1,6 +1,7 @@ export default { name: 'RichContent', selector: '.RichContent', + notEditable: true, validInnerComponents: [ 'Text', 'FunText', diff --git a/src/components/settings_modal/settings_modal_user_content.scss b/src/components/settings_modal/settings_modal_user_content.scss index 74172c82c..b7e258fda 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/tabs/appearance_tab.js b/src/components/settings_modal/tabs/appearance_tab.js index 1e8f596f2..b4b401574 100644 --- a/src/components/settings_modal/tabs/appearance_tab.js +++ b/src/components/settings_modal/tabs/appearance_tab.js @@ -3,6 +3,7 @@ import ChoiceSetting from '../helpers/choice_setting.vue' import IntegerSetting from '../helpers/integer_setting.vue' import FloatSetting from '../helpers/float_setting.vue' import UnitSetting, { defaultHorizontalUnits } from '../helpers/unit_setting.vue' +import PaletteEditor from 'src/components/palette_editor/palette_editor.vue' import FontControl from 'src/components/font_control/font_control.vue' @@ -50,6 +51,7 @@ const AppearanceTab = { 'cBlue', 'cOrange' ], + userPalette: {}, intersectionObserver: null, thirdColumnModeOptions: ['none', 'notifications', 'postform'].map(mode => ({ key: mode, @@ -76,7 +78,8 @@ const AppearanceTab = { UnitSetting, ProfileSettingIndicator, FontControl, - Preview + Preview, + PaletteEditor }, mounted () { const updateIndex = (resource) => { @@ -105,6 +108,7 @@ const AppearanceTab = { updateIndex('palette').then(bundledPalettes => { bundledPalettes.forEach(([key, palettePromise]) => palettePromise.then(v => { + let palette if (Array.isArray(v)) { const [ name, @@ -117,9 +121,15 @@ const AppearanceTab = { cBlue = '#0000FF', cOrange = '#E3FF00' ] = v - this.bundledPalettes.push({ key, name, bg, fg, text, link, cRed, cBlue, cGreen, cOrange }) + palette = { key, name, bg, fg, text, link, cRed, cBlue, cGreen, cOrange } + this.bundledPalettes.push() } else { - this.bundledPalettes.push({ key, ...v }) + palette = { key, ...v } + } + this.bundledPalettes.push(palette) + + if (this.isPaletteActive(key)) { + this.userPalette = palette } })) }) @@ -283,30 +293,21 @@ const AppearanceTab = { return key === palette }, setStyle (name) { - this.$store.dispatch('resetThemeV2') this.$store.dispatch('setTheme', name) - this.$store.dispatch('applyTheme') }, setTheme (name) { - this.$store.dispatch('resetThemeV3') this.$store.dispatch('setTheme', name) - this.$store.dispatch('applyTheme') }, - setPalette (name) { - this.$store.dispatch('resetThemeV2') + setPalette (name, data) { this.$store.dispatch('setPalette', name) - this.$store.dispatch('applyTheme') + this.userPalette = data }, - setPaletteCustom (p) { - this.$store.dispatch('resetThemeV2') - this.$store.dispatch('setPaletteCustom', p) - this.$store.dispatch('applyTheme') + setPaletteCustom (data) { + this.$store.dispatch('setPaletteCustom', data) + this.userPalette = data }, resetTheming (name) { - this.$store.dispatch('resetThemeV2') - this.$store.dispatch('resetThemeV3') this.$store.dispatch('setStyle', 'stock') - this.$store.dispatch('applyTheme') }, previewTheme (key, input) { let theme3 diff --git a/src/components/settings_modal/tabs/appearance_tab.scss b/src/components/settings_modal/tabs/appearance_tab.scss index c78b4accc..ede4b3424 100644 --- a/src/components/settings_modal/tabs/appearance_tab.scss +++ b/src/components/settings_modal/tabs/appearance_tab.scss @@ -26,7 +26,8 @@ grid-gap: 0.5em; h4, - .unsupported-theme-v2 { + .unsupported-theme-v2, + .userPalette { grid-column: 1 / span 2; } } @@ -71,6 +72,7 @@ border-radius: var(--roundness); border: 1px solid var(--border); padding: 0; + margin-bottom: 1em; .theme-preview { font-size: 1rem; // fix for firefox diff --git a/src/components/settings_modal/tabs/appearance_tab.vue b/src/components/settings_modal/tabs/appearance_tab.vue index 1b43a690b..6ec84eb28 100644 --- a/src/components/settings_modal/tabs/appearance_tab.vue +++ b/src/components/settings_modal/tabs/appearance_tab.vue @@ -3,17 +3,8 @@ class="appearance-tab" :label="$t('settings.general')" > -
-

{{ $t('settings.theme') }}

- -
+

{{ $t('settings.theme') }}

-

{{ $t('settings.style.themes3.palette.label') }}

-
- - +
+ +
+
+

{{ $t('settings.style.themes3.palette.label') }}

+
+ + +
-
-
- {{ $t("settings.style.appearance_tab_note") }}

{{ $t('settings.scale_and_layout') }}

+
+ {{ $t("settings.style.appearance_tab_note") }} +