logo

pleroma-fe

My custom branche(s) on git.pleroma.social/pleroma/pleroma-fe git clone https://anongit.hacktivis.me/git/pleroma-fe.git/
commit: 3d77860e57892569cfe98bccfdc65d3a9c95dbf6
parent c937736feab589fb123b8208792d5f12e3a056de
Author: Henry Jameson <me@hjkos.com>
Date:   Fri,  4 Oct 2024 02:49:20 +0300

moved the select motion stuff into its own component

Diffstat:

Asrc/components/select/select_motion.vue115+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Msrc/components/settings_modal/tabs/style_tab/style_tab.vue422++++++++++++++++++++++++++++++++++++++++---------------------------------------
Msrc/components/shadow_control/shadow_control.js45++++++++++++---------------------------------
Msrc/components/shadow_control/shadow_control.vue55++++++++-----------------------------------------------
4 files changed, 351 insertions(+), 286 deletions(-)

diff --git a/src/components/select/select_motion.vue b/src/components/select/select_motion.vue @@ -0,0 +1,115 @@ +<template> + <div + class="SelectMotion btn-group" + > + <button + class="btn button-default" + :disabled="disabled || shadowsAreNull" + @click="add" + > + <FAIcon + fixed-width + icon="plus" + /> + </button> + <button + class="btn button-default" + :disabled="disabled || !moveUpValid" + :class="{ disabled: disabled || !moveUpValid }" + @click="moveUp" + > + <FAIcon + fixed-width + icon="chevron-up" + /> + </button> + <button + class="btn button-default" + :disabled="disabled || !moveDnValid" + :class="{ disabled: disabled || !moveDnValid }" + @click="moveDn" + > + <FAIcon + fixed-width + icon="chevron-down" + /> + </button> + <button + class="btn button-default" + :disabled="disabled || !present" + :class="{ disabled: disabled || !present }" + @click="del" + > + <FAIcon + fixed-width + icon="times" + /> + </button> + </div> +</template> + +<script setup> +import { computed, defineEmits, defineProps } from 'vue' + +const props = defineProps(['modelValue', 'selectedId', 'disabled', 'getAddValue']) +const emit = defineEmits(['update:modelValue', 'update:selectedId']) + +const moveUpValid = computed(() => { + return props.selectedId > 0 +}) + +const present = computed(() => props.modelValue[props.selectedId] != null) + +const moveUp = () => { + const newModel = [...props.modelValue] + const movable = newModel.splice(props.selectedId, 1)[0] + newModel.splice(props.selectedId - 1, 0, movable) + + emit('update:modelValue', newModel) + emit('update:selectedId', props.selectedId - 1) +} + +const moveDnValid = computed(() => { + return props.selectedId < props.modelValue.length - 1 +}) +const moveDn = () => { + const newModel = [...props.modelValue] + const movable = newModel.splice(props.selectedId.value, 1)[0] + newModel.splice(props.selectedId + 1, 0, movable) + + emit('update:modelValue', newModel) + emit('update:selectedId', props.selectedId + 1) +} + +const add = () => { + const newModel = [...props.modelValue] + newModel.push(props.getAddValue()) + console.log(newModel) + + emit('update:modelValue', newModel) + emit('update:selectedId', Math.max(newModel.length - 1, 0)) +} + +const del = () => { + const newModel = [...props.modelValue] + newModel.splice(props.selectedId, 1) + + emit('update:modelValue', newModel) + emit('update:selectedId', newModel.length === 0 ? undefined : Math.max(props.selectedId - 1, 0)) +} +</script> + +<style lang="scss"> +.SelectMotion { + flex: 0 0 auto; + display: grid; + grid-auto-columns: 1fr; + grid-auto-flow: column; + margin-top: 0.25em; + + .button-default { + margin: 0; + padding: 0; + } +} +</style> diff --git a/src/components/settings_modal/tabs/style_tab/style_tab.vue b/src/components/settings_modal/tabs/style_tab/style_tab.vue @@ -51,231 +51,241 @@ </li> </ul> </div> - <div class="setting-item component-editor"> - <div class="component-selector"> - <label for="component-selector"> - {{ $t('settings.style.themes3.editor.component_selector') }} - {{ ' ' }} - </label> - <Select - id="component-selector" - v-model="selectedComponentKey" - > - <option - v-for="key in componentKeys" - :key="'component-' + key" - :value="key" - > - {{ fallbackI18n($t(getFriendlyNamePath(componentsMap.get(key).name)), componentsMap.get(key).name) }} - </option> - </Select> - </div> + <tab-switcher> <div - v-if="selectedComponentVariantsAll.length > 1" - class="variant-selector" + class="setting-item component-editor" + key="component" + :label="$t('settings.style.themes3.editor.component_tab')" > - <label for="variant-selector"> - {{ $t('settings.style.themes3.editor.variant_selector') }} - </label> - <Select - v-model="selectedVariant" - > - <option - v-for="variant in selectedComponentVariantsAll" - :key="'component-variant-' + variant" - :value="variant" + <div class="component-selector"> + <label for="component-selector"> + {{ $t('settings.style.themes3.editor.component_selector') }} + {{ ' ' }} + </label> + <Select + id="component-selector" + v-model="selectedComponentKey" > - {{ fallbackI18n($t(getVariantPath(selectedComponentName, variant)), variant) }} - </option> - </Select> - </div> - <div - v-if="selectedComponentStates.length > 0" - class="state-selector" - > - <label> - {{ $t('settings.style.themes3.editor.states_selector') }} - </label> - <ul - class="state-selector-list" + <option + v-for="key in componentKeys" + :key="'component-' + key" + :value="key" + > + {{ fallbackI18n($t(getFriendlyNamePath(componentsMap.get(key).name)), componentsMap.get(key).name) }} + </option> + </Select> + </div> + <div + v-if="selectedComponentVariantsAll.length > 1" + class="variant-selector" > - <li - v-for="state in selectedComponentStates" - :key="'component-state-' + state" + <label for="variant-selector"> + {{ $t('settings.style.themes3.editor.variant_selector') }} + </label> + <Select + v-model="selectedVariant" > - <Checkbox - :value="selectedState.has(state)" - @update:modelValue="(v) => updateSelectedStates(state, v)" + <option + v-for="variant in selectedComponentVariantsAll" + :key="'component-variant-' + variant" + :value="variant" > - {{ fallbackI18n($t(getStatePath(selectedComponentName, state)), state) }} - </Checkbox> - </li> - </ul> - </div> - <div class="preview-container"> - <!-- eslint-disable vue/no-v-html vue/no-v-text-v-html-on-component --> - <component - :is="'style'" - v-html="previewCss" - /> - <!-- eslint-enable vue/no-v-html vue/no-v-text-v-html-on-component --> - <ComponentPreview - class="component-preview" - :show-text="componentHas('Text')" - :shadow-control="isShadowTabOpen" - :preview-class="previewClass" - :preview-style="editorHintStyle" - :disabled="!editedSubShadow && typeof editedShadow !== 'string'" - :shadow="editedSubShadow" - @update:shadow="({ axis, value }) => updateSubShadow(axis, value)" - /> - </div> - <tab-switcher - ref="tabSwitcher" - class="component-settings" - :on-switch="onTabSwitch" - > + {{ fallbackI18n($t(getVariantPath(selectedComponentName, variant)), variant) }} + </option> + </Select> + </div> <div - key="main" - class="editor-tab" - :label="$t('settings.style.themes3.editor.main_tab')" + v-if="selectedComponentStates.length > 0" + class="state-selector" > - <ColorInput - v-model="editedBackgroundColor" - :disabled="!isBackgroundColorPresent" - :label="$t('settings.style.themes3.editor.background')" - /> - <Tooltip :text="$t('settings.style.themes3.editor.include_in_rule')"> - <Checkbox v-model="isBackgroundColorPresent" /> - </Tooltip> - <OpacityInput - v-model="editedOpacity" - :disabled="!isOpacityPresent" - :label="$t('settings.style.themes3.editor.opacity')" + <label> + {{ $t('settings.style.themes3.editor.states_selector') }} + </label> + <ul + class="state-selector-list" + > + <li + v-for="state in selectedComponentStates" + :key="'component-state-' + state" + > + <Checkbox + :value="selectedState.has(state)" + @update:modelValue="(v) => updateSelectedStates(state, v)" + > + {{ fallbackI18n($t(getStatePath(selectedComponentName, state)), state) }} + </Checkbox> + </li> + </ul> + </div> + <div class="preview-container"> + <!-- eslint-disable vue/no-v-html vue/no-v-text-v-html-on-component --> + <component + :is="'style'" + v-html="previewCss" /> - <Tooltip :text="$t('settings.style.themes3.editor.include_in_rule')"> - <Checkbox v-model="isOpacityPresent" /> - </Tooltip> - <ColorInput - v-if="componentHas('Text')" - v-model="editedTextColor" - :label="$t('settings.style.themes3.editor.text_color')" - :disabled="!isTextColorPresent" + <!-- eslint-enable vue/no-v-html vue/no-v-text-v-html-on-component --> + <ComponentPreview + class="component-preview" + :show-text="componentHas('Text')" + :shadow-control="isShadowTabOpen" + :preview-class="previewClass" + :preview-style="editorHintStyle" + :disabled="!editedSubShadow && typeof editedShadow !== 'string'" + :shadow="editedSubShadow" + @update:shadow="({ axis, value }) => updateSubShadow(axis, value)" /> - <Tooltip - v-if="componentHas('Text')" - :text="$t('settings.style.themes3.editor.include_in_rule')" + </div> + <tab-switcher + ref="tabSwitcher" + class="component-settings" + :on-switch="onTabSwitch" + > + <div + key="main" + class="editor-tab" + :label="$t('settings.style.themes3.editor.main_tab')" > - <Checkbox v-model="isTextColorPresent" /> - </Tooltip> - <div class="style-control suboption"> - <label - for="textAuto" - class="label" - :class="{ faint: !isTextAutoPresent }" + <ColorInput + v-model="editedBackgroundColor" + :disabled="!isBackgroundColorPresent" + :label="$t('settings.style.themes3.editor.background')" + /> + <Tooltip :text="$t('settings.style.themes3.editor.include_in_rule')"> + <Checkbox v-model="isBackgroundColorPresent" /> + </Tooltip> + <OpacityInput + v-model="editedOpacity" + :disabled="!isOpacityPresent" + :label="$t('settings.style.themes3.editor.opacity')" + /> + <Tooltip :text="$t('settings.style.themes3.editor.include_in_rule')"> + <Checkbox v-model="isOpacityPresent" /> + </Tooltip> + <ColorInput + v-if="componentHas('Text')" + v-model="editedTextColor" + :label="$t('settings.style.themes3.editor.text_color')" + :disabled="!isTextColorPresent" + /> + <Tooltip + v-if="componentHas('Text')" + :text="$t('settings.style.themes3.editor.include_in_rule')" + > + <Checkbox v-model="isTextColorPresent" /> + </Tooltip> + <div class="style-control suboption"> + <label + for="textAuto" + class="label" + :class="{ faint: !isTextAutoPresent }" + > + {{ $t('settings.style.themes3.editor.text_auto.label') }} + </label> + <Select + id="textAuto" + v-model="editedTextAuto" + :disabled="!isTextAutoPresent" + > + <option value="no-preserve"> + {{ $t('settings.style.themes3.editor.text_auto.no-preserve') }} + </option> + <option value="no-auto"> + {{ $t('settings.style.themes3.editor.text_auto.no-auto') }} + </option> + <option value="preserve"> + {{ $t('settings.style.themes3.editor.text_auto.preserve') }} + </option> + </Select> + </div> + <Tooltip + v-if="componentHas('Text')" + :text="$t('settings.style.themes3.editor.include_in_rule')" > - {{ $t('settings.style.themes3.editor.text_auto.label') }} - </label> - <Select - id="textAuto" - v-model="editedTextAuto" - :disabled="!isTextAutoPresent" + <Checkbox v-model="isTextAutoPresent" /> + </Tooltip> + <div> + <ContrastRatio :contrast="getContrast(editedBackgroundColor, editedTextColor)" /> + </div> + <div> + <!-- spacer for missing checkbox --> + </div> + <ColorInput + v-if="componentHas('Link')" + v-model="editedLinkColor" + :label="$t('settings.style.themes3.editor.link_color')" + :disabled="!isLinkColorPresent" + /> + <Tooltip + v-if="componentHas('Link')" + :text="$t('settings.style.themes3.editor.include_in_rule')" > - <option value="no-preserve"> - {{ $t('settings.style.themes3.editor.text_auto.no-preserve') }} - </option> - <option value="no-auto"> - {{ $t('settings.style.themes3.editor.text_auto.no-auto') }} - </option> - <option value="preserve"> - {{ $t('settings.style.themes3.editor.text_auto.preserve') }} - </option> - </Select> + <Checkbox v-model="isLinkColorPresent" /> + </Tooltip> + <ColorInput + v-if="componentHas('Icon')" + v-model="editedIconColor" + :label="$t('settings.style.themes3.editor.icon_color')" + :disabled="!isIconColorPresent" + /> + <Tooltip + v-if="componentHas('Icon')" + :text="$t('settings.style.themes3.editor.include_in_rule')" + > + <Checkbox v-model="isIconColorPresent" /> + </Tooltip> </div> - <Tooltip - v-if="componentHas('Text')" - :text="$t('settings.style.themes3.editor.include_in_rule')" + <div + key="shadow" + class="editor-tab shadow-tab" + :label="$t('settings.style.themes3.editor.shadows_tab')" > - <Checkbox v-model="isTextAutoPresent" /> - </Tooltip> - <div> - <ContrastRatio :contrast="getContrast(editedBackgroundColor, editedTextColor)" /> - </div> - <div> - <!-- spacer for missing checkbox --> + <Checkbox + v-model="isShadowPresent" + class="style-control" + > + {{ $t('settings.style.themes3.editor.include_in_rule') }} + </checkbox> + <ShadowControl + v-model="editedShadow" + :disabled="!isShadowPresent" + :no-preview="true" + :separate-inset="shadowSelected === 'avatar' || shadowSelected === 'avatarStatus'" + @subShadowSelected="onSubShadow" + /> </div> - <ColorInput - v-if="componentHas('Link')" - v-model="editedLinkColor" - :label="$t('settings.style.themes3.editor.link_color')" - :disabled="!isLinkColorPresent" - /> - <Tooltip - v-if="componentHas('Link')" - :text="$t('settings.style.themes3.editor.include_in_rule')" - > - <Checkbox v-model="isLinkColorPresent" /> - </Tooltip> - <ColorInput - v-if="componentHas('Icon')" - v-model="editedIconColor" - :label="$t('settings.style.themes3.editor.icon_color')" - :disabled="!isIconColorPresent" - /> - <Tooltip - v-if="componentHas('Icon')" - :text="$t('settings.style.themes3.editor.include_in_rule')" - > - <Checkbox v-model="isIconColorPresent" /> - </Tooltip> - </div> - <div - key="shadow" - class="editor-tab shadow-tab" - :label="$t('settings.style.themes3.editor.shadows_tab')" - > - <Checkbox - v-model="isShadowPresent" - class="style-control" + </tab-switcher> + </div> + <div + key="palette" + :label="$t('settings.style.themes3.editor.palette_tab')" + class="setting-item palette-editor" + > + <div class="label"> + <label for="palette-selector"> + {{ $t('settings.style.themes3.palette.label') }} + {{ ' ' }} + </label> + <Select + id="palette-selector" + v-model="editedPalette" > - {{ $t('settings.style.themes3.editor.include_in_rule') }} - </checkbox> - <ShadowControl - v-model="editedShadow" - :disabled="!isShadowPresent" - :no-preview="true" - :separate-inset="shadowSelected === 'avatar' || shadowSelected === 'avatarStatus'" - @subShadowSelected="onSubShadow" - /> + <option + key="dark" + value="dark" + > + {{ $t('settings.style.themes3.palette.dark') }} + </option> + <option + key="light" + value="light" + > + {{ $t('settings.style.themes3.palette.light') }} + </option> + </Select> </div> - </tab-switcher> - </div> - <div class="setting-item palette-editor"> - <div class="label"> - <label for="palette-selector"> - {{ $t('settings.style.themes3.palette.label') }} - {{ ' ' }} - </label> - <Select - id="palette-selector" - v-model="editedPalette" - > - <option - key="dark" - value="dark" - > - {{ $t('settings.style.themes3.palette.dark') }} - </option> - <option - key="light" - value="light" - > - {{ $t('settings.style.themes3.palette.light') }} - </option> - </Select> + <PaletteEditor v-model="palette" /> </div> - <PaletteEditor v-model="palette" /> - </div> + </tab-switcher> </div> </template> diff --git a/src/components/shadow_control/shadow_control.js b/src/components/shadow_control/shadow_control.js @@ -1,6 +1,7 @@ import ColorInput from 'src/components/color_input/color_input.vue' import OpacityInput from 'src/components/opacity_input/opacity_input.vue' import Select from 'src/components/select/select.vue' +import SelectMotion from 'src/components/select/select_motion.vue' import Checkbox from 'src/components/checkbox/checkbox.vue' import Popover from 'src/components/popover/popover.vue' import ComponentPreview from 'src/components/component_preview/component_preview.vue' @@ -54,13 +55,11 @@ export default { ColorInput, OpacityInput, Select, + SelectMotion, Checkbox, Popover, ComponentPreview }, - beforeUpdate () { - this.cValue = (this.modelValue ?? this.fallback ?? []).map(toModel) - }, computed: { selectedType: { get () { @@ -73,7 +72,6 @@ export default { selected: { get () { const selected = this.cValue[this.selectedId] - console.log('SELECTED', selected) if (selected && typeof selected === 'object') { return { ...selected } } else if (typeof selected === 'string') { @@ -95,12 +93,6 @@ export default { currentFallback () { return this.fallback?.[this.selectedId] }, - moveUpValid () { - return this.selectedId > 0 - }, - moveDnValid () { - return this.selectedId < this.cValue.length - 1 - }, usingFallback () { return this.modelValue == null }, @@ -123,11 +115,20 @@ export default { } }, watch: { + modelValue (value) { + if (!value) this.cValue = (this.modelValue ?? this.fallback ?? []).map(toModel) + }, selected (value) { this.$emit('subShadowSelected', this.selectedId) } }, methods: { + getNewSubshadow () { + return toModel(this.selected) + }, + onSelectChange (id) { + this.selectedId = id + }, getSubshadowLabel (shadow, index) { if (typeof shadow === 'object') { return shadow?.name ?? this.$t('settings.style.shadows.shadow_id', { value: index }) @@ -141,28 +142,6 @@ export default { this.cValue[this.selectedId].spread = 0 } this.$emit('update:modelValue', this.cValue) - }, 100), - add () { - this.cValue.push(toModel(this.selected)) - this.selectedId = Math.max(this.cValue.length - 1, 0) - this.$emit('update:modelValue', this.cValue) - }, - del () { - this.cValue.splice(this.selectedId, 1) - this.selectedId = this.cValue.length === 0 ? undefined : Math.max(this.selectedId - 1, 0) - this.$emit('update:modelValue', this.cValue) - }, - moveUp () { - const movable = this.cValue.splice(this.selectedId, 1)[0] - this.cValue.splice(this.selectedId - 1, 0, movable) - this.selectedId -= 1 - this.$emit('update:modelValue', this.cValue) - }, - moveDn () { - const movable = this.cValue.splice(this.selectedId, 1)[0] - this.cValue.splice(this.selectedId + 1, 0, movable) - this.selectedId += 1 - this.$emit('update:modelValue', this.cValue) - } + }, 100) } } diff --git a/src/components/shadow_control/shadow_control.vue b/src/components/shadow_control/shadow_control.vue @@ -28,53 +28,14 @@ {{ getSubshadowLabel(shadow, index) }} </option> </Select> - <div - class="id-control btn-group arrange-buttons" - > - <button - class="btn button-default" - :disabled="disabled || shadowsAreNull" - @click="add" - > - <FAIcon - fixed-width - icon="plus" - /> - </button> - <button - class="btn button-default" - :disabled="disabled || !moveUpValid" - :class="{ disabled: disabled || !moveUpValid }" - @click="moveUp" - > - <FAIcon - fixed-width - icon="chevron-up" - /> - </button> - <button - class="btn button-default" - :disabled="disabled || !moveDnValid" - :class="{ disabled: disabled || !moveDnValid }" - @click="moveDn" - > - <FAIcon - fixed-width - icon="chevron-down" - /> - </button> - <button - class="btn button-default" - :disabled="disabled || !present" - :class="{ disabled: disabled || !present }" - @click="del" - > - <FAIcon - fixed-width - icon="times" - /> - </button> - </div> + <SelectMotion + class="arrange-buttons" + v-model="cValue" + :selectedId="selectedId" + :get-add-value="getNewSubshadow" + :disabled="disabled" + @update:selectedId="onSelectChange" + /> </div> <div class="shadow-tweak"> <Select