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: 582ec616b86f0c87e6d989c2303486caf70edfa7
parent 4150ded11f07c90beec859b8f5b4bc806e4b9fbe
Author: HJ <30-hj@users.noreply.git.pleroma.social>
Date:   Tue, 14 Jan 2025 07:52:11 +0000

Merge branch 'fixes-batch2' into 'develop'

Fixes batch2

Closes #1351 and #1350

See merge request pleroma/pleroma-fe!1968

Diffstat:

Achangelog.d/batch2.skip0
Msrc/components/button.style.js16++++++++--------
Msrc/components/chat_message/chat_message.js1-
Msrc/components/chat_message/chat_message.vue1-
Msrc/components/dialog_modal/dialog_modal.js5+++++
Msrc/components/dialog_modal/dialog_modal.vue7++++++-
Msrc/components/draft/draft.vue4++--
Msrc/components/edit_status_modal/edit_status_modal.vue1+
Msrc/components/emoji_reactions/emoji_reactions.vue9---------
Msrc/components/font_control/font_control.vue19++++++++++++++++---
Msrc/components/input.style.js2+-
Msrc/components/notification/notification.js1-
Msrc/components/notification/notification.vue1-
Msrc/components/panel.style.js16++++++++++++----
Msrc/components/panel_header.style.js18+++++++++++++++++-
Msrc/components/post_status_form/post_status_form.js20++++++++++++++++++--
Msrc/components/post_status_form/post_status_form.vue14+++++++++-----
Msrc/components/post_status_modal/post_status_modal.vue2++
Msrc/components/settings_modal/tabs/appearance_tab.vue93++++++++++++++++++++++++++++++++++++++++---------------------------------------
Msrc/components/status/status.js3---
Msrc/components/status/status.vue4++--
Msrc/components/top_bar.style.js12++++++++++--
Msrc/components/user_avatar/avatar.style.js4++--
Msrc/components/user_avatar/user_avatar.js4++--
Msrc/components/user_card/user_card.js1-
Msrc/components/user_card/user_card.vue11++---------
Msrc/i18n/en.json7+++++--
Msrc/modules/config.js1+
Msrc/modules/instance.js1+
Msrc/services/theme_data/theme3_slot_functions.js21++++++++++++++++++++-
Mstatic/styles/Redmond DX.iss2+-
31 files changed, 190 insertions(+), 111 deletions(-)

diff --git a/changelog.d/batch2.skip b/changelog.d/batch2.skip diff --git a/src/components/button.style.js b/src/components/button.style.js @@ -35,11 +35,11 @@ export default { { component: 'Root', directives: { - '--buttonDefaultHoverGlow': 'shadow | 0 0 4 --text / 0.5', - '--buttonDefaultFocusGlow': 'shadow | 0 0 4 4 --link / 0.5', + '--buttonDefaultHoverGlow': 'shadow | 0 0 1 2 --text / 0.4', + '--buttonDefaultFocusGlow': 'shadow | 0 0 1 2 --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)' + '--buttonDefaultBevel': 'shadow | $borderSide(#FFFFFF top 0.2 1), $borderSide(#000000 bottom 0.2 1)', + '--buttonPressedBevel': 'shadow | inset 0 0 4 #000000, $borderSide(#FFFFFF bottom 0.2 1), $borderSide(#000000 top 0.2 1)' } }, { @@ -78,28 +78,28 @@ export default { { state: ['toggled'], directives: { - background: '--inheritedBackground,-14.2', + background: '--accent,-24.2', shadow: ['--buttonDefaultShadow', '--buttonPressedBevel'] } }, { state: ['toggled', 'hover'], directives: { - background: '--inheritedBackground,-14.2', + background: '--accent,-24.2', shadow: ['--buttonDefaultHoverGlow', '--buttonPressedBevel'] } }, { state: ['toggled', 'disabled'], directives: { - background: '$blend(--inheritedBackground 0.25 --parent)', + background: '$blend(--accent 0.25 --parent)', shadow: ['--buttonPressedBevel'] } }, { state: ['disabled'], directives: { - background: '$blend(--inheritedBackground 0.25 --parent)', + background: '$blend(--accent 0.25 --parent)', shadow: ['--buttonDefaultBevel'] } }, diff --git a/src/components/chat_message/chat_message.js b/src/components/chat_message/chat_message.js @@ -66,7 +66,6 @@ const ChatMessage = { return this.message.attachments.length > 0 }, ...mapState({ - betterShadow: state => state.interface.browserSupport.cssFilter, currentUser: state => state.users.currentUser, restrictedNicknames: state => state.instance.restrictedNicknames }), diff --git a/src/components/chat_message/chat_message.vue b/src/components/chat_message/chat_message.vue @@ -20,7 +20,6 @@ > <UserAvatar :compact="true" - :better-shadow="betterShadow" :user="author" /> </UserPopover> diff --git a/src/components/dialog_modal/dialog_modal.js b/src/components/dialog_modal/dialog_modal.js @@ -8,6 +8,11 @@ const DialogModal = { default: () => {}, type: Function } + }, + computed: { + mobileCenter () { + return this.$store.getters.mergedConfig.modalMobileCenter + } } } diff --git a/src/components/dialog_modal/dialog_modal.vue b/src/components/dialog_modal/dialog_modal.vue @@ -1,7 +1,7 @@ <template> <span class="dialog-container" - :class="{ 'dark-overlay': darkOverlay }" + :class="{ 'dark-overlay': darkOverlay, '-center-mobile': mobileCenter }" @click.self.stop="onCancel()" > <div @@ -79,6 +79,7 @@ padding: 0.5em; border-top: 1px solid var(--border); display: grid; + justify-content: end; grid-gap: 0.5em; grid-template-columns: min-content; grid-auto-columns: min-content; @@ -99,6 +100,10 @@ justify-content: stretch; align-items: end; justify-items: stretch; + + &.-center-mobile { + align-items: center; + } } .dialog-modal.panel { diff --git a/src/components/draft/draft.vue b/src/components/draft/draft.vue @@ -64,12 +64,12 @@ <div v-if="editing"> <PostStatusForm v-if="draft.type !== 'edit'" - :disable-draft="true" + :hide-draft="true" v-bind="postStatusFormProps" /> <EditStatusForm v-else - :disable-draft="true" + :hide-draft="true" :params="postStatusFormProps" /> </div> diff --git a/src/components/edit_status_modal/edit_status_modal.vue b/src/components/edit_status_modal/edit_status_modal.vue @@ -15,6 +15,7 @@ class="panel-body" :params="params" @posted="doCloseModal" + @draft-done="doCloseModal" @can-close="doCloseModal" /> </div> diff --git a/src/components/emoji_reactions/emoji_reactions.vue b/src/components/emoji_reactions/emoji_reactions.vue @@ -99,11 +99,6 @@ display: inline-flex; justify-content: center; align-items: center; - - &.-picked-reaction { - border: 1px solid var(--accent); - margin-right: -1px; - } } } } @@ -154,10 +149,6 @@ } &.-picked-reaction { - border: 1px solid var(--accent); - margin-left: -1px; // offset the border, can't use inset shadows either - margin-right: -1px; - .svg-inline--fa { color: var(--accent); } diff --git a/src/components/font_control/font_control.vue b/src/components/font_control/font_control.vue @@ -5,18 +5,22 @@ :for="manualEntry ? name : name + '-font-switcher'" class="label" > - {{ label }} + {{ $t('settings.style.themes3.font.label', { label }) }} </label> {{ ' ' }} <Checkbox v-if="typeof fallback !== 'undefined'" + class="font-checkbox" :id="name + '-o'" :model-value="present" @change="$emit('update:modelValue', typeof modelValue === 'undefined' ? fallback : undefined)" > {{ $t('settings.style.themes3.define') }} </Checkbox> - <p v-if="modelValue?.family"> + <div + v-if="modelValue?.family" + class="font-input" + > <label v-if="manualEntry" :id="name + '-label'" @@ -122,7 +126,7 @@ </optgroup> </Select> </span> - </p> + </div> </div> </template> @@ -134,6 +138,15 @@ min-width: 20em; max-width: 20em; } + + .font-input { + margin-left: 2em; + margin-top: 0.5em; + } + + .font-checkbox { + margin-left: 1em; + } } .invalid-tooltip { diff --git a/src/components/input.style.js b/src/components/input.style.js @@ -18,7 +18,7 @@ export default { { component: 'Root', directives: { - '--defaultInputBevel': 'shadow | $borderSide(#FFFFFF bottom 0.2), $borderSide(#000000 top 0.2)', + '--defaultInputBevel': 'shadow | $borderSide(#FFFFFF bottom 0.2), $borderSide(#000000 top 0.2), inset 0 0 2 #000000 / 0.15', '--defaultInputHoverGlow': 'shadow | 0 0 4 --text / 0.5', '--defaultInputFocusGlow': 'shadow | 0 0 4 4 --link / 0.5' } diff --git a/src/components/notification/notification.js b/src/components/notification/notification.js @@ -43,7 +43,6 @@ const Notification = { data () { return { statusExpanded: false, - betterShadow: this.$store.state.interface.browserSupport.cssFilter, unmuted: false, showingApproveConfirmDialog: false, showingDenyConfirmDialog: false diff --git a/src/components/notification/notification.vue b/src/components/notification/notification.vue @@ -48,7 +48,6 @@ <UserAvatar class="post-avatar" :compact="true" - :better-shadow="betterShadow" :user="notification.from_profile" /> </UserPopover> diff --git a/src/components/panel.style.js b/src/components/panel.style.js @@ -38,12 +38,20 @@ export default { roundness: 3, blur: '5px', shadow: [{ - x: 1, - y: 1, - blur: 4, + x: 0, + y: 0, + blur: 3, spread: 0, color: '#000000', - alpha: 0.6 + alpha: 0.5 + }, + { + x: 0, + y: 4, + blur: 6, + spread: 3, + color: '#000000', + alpha: 0.3 }] } } diff --git a/src/components/panel_header.style.js b/src/components/panel_header.style.js @@ -17,7 +17,23 @@ export default { directives: { backgroundNoCssColor: 'yes', background: '--fg', - shadow: [] + shadow: [{ + x: 0, + y: 1, + blur: 3, + spread: 0, + color: '#000000', + alpha: 0.4 + }, + { + x: 0, + y: 1, + blur: 0, + spread: 0, + color: '#ffffff', + alpha: 0.2, + inset: true + }] } } ] diff --git a/src/components/post_status_form/post_status_form.js b/src/components/post_status_form/post_status_form.js @@ -101,6 +101,8 @@ const PostStatusForm = { 'disableSubmit', 'disablePreview', 'disableDraft', + 'hideDraft', + 'closeable', 'placeholder', 'maxHeight', 'postHandler', @@ -115,6 +117,7 @@ const PostStatusForm = { ], emits: [ 'posted', + 'draft-done', 'resize', 'mediaplay', 'mediapause', @@ -232,6 +235,9 @@ const PostStatusForm = { showAllScopes () { return !this.mergedConfig.minimalScopesMode }, + hideExtraActions () { + return this.disableDraft || this.hideDraft + }, emojiUserSuggestor () { return suggestor({ emoji: [ @@ -353,10 +359,12 @@ const PostStatusForm = { } }, safeToSaveDraft () { - return this.newStatus.status || + return ( + this.newStatus.status || this.newStatus.spoilerText || this.newStatus.files?.length || this.newStatus.hasPoll + ) && this.saveable }, ...mapGetters(['mergedConfig']), ...mapState({ @@ -760,12 +768,20 @@ const PostStatusForm = { this.newStatus.id = id } this.saveable = false + if (!this.shouldAutoSaveDraft) { + this.clearStatus() + this.$emit('draft-done') + } }) } else if (this.newStatus.id) { // There is a draft, but there is nothing in it, clear it return this.abandonDraft() .then(() => { this.saveable = false + if (!this.shouldAutoSaveDraft) { + this.clearStatus() + this.$emit('draft-done') + } }) } } @@ -773,7 +789,7 @@ const PostStatusForm = { }, maybeAutoSaveDraft () { if (this.shouldAutoSaveDraft) { - this.saveDraft() + this.saveDraft(false) } }, abandonDraft () { diff --git a/src/components/post_status_form/post_status_form.vue b/src/components/post_status_form/post_status_form.vue @@ -316,13 +316,12 @@ </template> </button> <Popover - v-if="!disableDraft" + v-if="!hideExtraActions" class="more-post-actions" :normal-button="true" trigger="click" placement="bottom" :offset="{ y: 5 }" - :bound-to="{ x: 'container' }" > <template #trigger> <FAIcon @@ -336,15 +335,20 @@ role="menu" > <button - v-if="!disableDraft" + v-if="!hideDraft || !disableDraft" class="menu-item dropdown-item dropdown-item-icon" role="menu" - :disabled="!safeToSaveDraft" + :disabled="!safeToSaveDraft && saveable" :class="{ disabled: !safeToSaveDraft }" @click.prevent="saveDraft" @click="close" > - {{ $t('post_status.save_to_drafts_button') }} + <template v-if="closeable"> + {{ $t('post_status.save_to_drafts_and_close_button') }} + </template> + <template v-else> + {{ $t('post_status.save_to_drafts_button') }} + </template> </button> </div> </template> diff --git a/src/components/post_status_modal/post_status_modal.vue b/src/components/post_status_modal/post_status_modal.vue @@ -14,7 +14,9 @@ <PostStatusForm class="panel-body" v-bind="params" + :closeable="true" @posted="resetAndClose" + @draft-done="resetAndClose" /> </div> </Modal> diff --git a/src/components/settings_modal/tabs/appearance_tab.vue b/src/components/settings_modal/tabs/appearance_tab.vue @@ -57,7 +57,7 @@ :key="style.key" :data-theme-key="style.key" class="button-default theme-preview" - :class="{ toggled: isStyleActive(style.key), disabled: switchInProgress }" + :class="{ toggled: isThemeActive(style.key), disabled: switchInProgress }" @click="style.version === 'v2' ? setTheme(style.key) : setStyle(style.key)" :disabled="switchInProgress" > @@ -207,51 +207,6 @@ </div> </li> <li> - <h3>{{ $t('settings.style.interface_font_user_override') }}</h3> - <ul class="setting-list"> - <li> - <FontControl - :model-value="mergedConfig.theme3hacks.fonts.interface" - name="ui" - :label="$t('settings.style.fonts.components.interface')" - :fallback="{ family: 'sans-serif' }" - no-inherit="1" - @update:modelValue="v => updateFont('interface', v)" - /> - </li> - <li> - <FontControl - v-if="expertLevel > 0" - :model-value="mergedConfig.theme3hacks.fonts.input" - name="input" - :fallback="{ family: 'inherit' }" - :label="$t('settings.style.fonts.components.input')" - @update:modelValue="v => updateFont('input', v)" - /> - </li> - <li> - <FontControl - v-if="expertLevel > 0" - :model-value="mergedConfig.theme3hacks.fonts.post" - name="post" - :fallback="{ family: 'inherit' }" - :label="$t('settings.style.fonts.components.post')" - @update:modelValue="v => updateFont('post', v)" - /> - </li> - <li> - <FontControl - v-if="expertLevel > 0" - :model-value="mergedConfig.theme3hacks.fonts.monospace" - name="postCode" - :fallback="{ family: 'monospace' }" - :label="$t('settings.style.fonts.components.monospace')" - @update:modelValue="v => updateFont('monospace', v)" - /> - </li> - </ul> - </li> - <li> <UnitSetting path="emojiSize" :step="0.1" @@ -284,6 +239,47 @@ {{ $t('settings.navbar_size') }} </UnitSetting> </li> + <h3>{{ $t('settings.style.interface_font_user_override') }}</h3> + <li> + <FontControl + :model-value="mergedConfig.theme3hacks.fonts.interface" + name="ui" + :label="$t('settings.style.fonts.components.interface')" + :fallback="{ family: 'sans-serif' }" + no-inherit="1" + @update:modelValue="v => updateFont('interface', v)" + /> + </li> + <li> + <FontControl + v-if="expertLevel > 0" + :model-value="mergedConfig.theme3hacks.fonts.input" + name="input" + :fallback="{ family: 'inherit' }" + :label="$t('settings.style.fonts.components.input')" + @update:modelValue="v => updateFont('input', v)" + /> + </li> + <li> + <FontControl + v-if="expertLevel > 0" + :model-value="mergedConfig.theme3hacks.fonts.post" + name="post" + :fallback="{ family: 'inherit' }" + :label="$t('settings.style.fonts.components.post')" + @update:modelValue="v => updateFont('post', v)" + /> + </li> + <li> + <FontControl + v-if="expertLevel > 0" + :model-value="mergedConfig.theme3hacks.fonts.monospace" + name="postCode" + :fallback="{ family: 'monospace' }" + :label="$t('settings.style.fonts.components.monospace')" + @update:modelValue="v => updateFont('monospace', v)" + /> + </li> <h3>{{ $t('settings.columns') }}</h3> <li> <UnitSetting @@ -346,6 +342,11 @@ <h2>{{ $t('settings.visual_tweaks') }}</h2> <ul class="setting-list"> <li> + <BooleanSetting path="modalMobileCenter"> + {{ $t('settings.mobile_center_dialog') }} + </BooleanSetting> + </li> + <li> <ChoiceSetting id="forcedRoundness" path="forcedRoundness" diff --git a/src/components/status/status.js b/src/components/status/status.js @@ -416,9 +416,6 @@ const Status = { currentUser () { return this.$store.state.users.currentUser }, - betterShadow () { - return this.$store.state.interface.browserSupport.cssFilter - }, mergedConfig () { return this.$store.getters.mergedConfig }, diff --git a/src/components/status/status.vue b/src/components/status/status.vue @@ -65,7 +65,6 @@ v-if="retweet" class="left-side repeater-avatar" :show-actor-type-indicator="showActorTypeIndicator" - :better-shadow="betterShadow" :user="statusoid.user" /> <div class="right-side faint"> @@ -120,7 +119,6 @@ class="post-avatar" :show-actor-type-indicator="showActorTypeIndicator" :compact="compact" - :better-shadow="betterShadow" :user="status.user" /> </UserPopover> @@ -600,12 +598,14 @@ <PostStatusForm ref="postStatusForm" class="reply-body" + :closeable="true" :reply-to="status.id" :attentions="status.attentions" :replied-user="status.user" :copy-message-scope="status.visibility" :subject="replySubject" @posted="doToggleReplying" + @draft-done="doToggleReplying" @can-close="doToggleReplying" /> </div> diff --git a/src/components/top_bar.style.js b/src/components/top_bar.style.js @@ -16,11 +16,19 @@ export default { background: '--fg', shadow: [{ x: 0, - y: 0, + y: 1, blur: 4, spread: 0, color: '#000000', - alpha: 0.6 + alpha: 0.4 + }, + { + x: 0, + y: 2, + blur: 7, + spread: 0, + color: '#000000', + alpha: 0.3 }] } }, diff --git a/src/components/user_avatar/avatar.style.js b/src/components/user_avatar/avatar.style.js @@ -11,10 +11,10 @@ export default { shadow: [{ x: 0, y: 1, - blur: 8, + blur: 4, spread: 0, color: '#000000', - alpha: 0.7 + alpha: 0.2 }] } } diff --git a/src/components/user_avatar/user_avatar.js b/src/components/user_avatar/user_avatar.js @@ -15,14 +15,14 @@ library.add( const UserAvatar = { props: [ 'user', - 'betterShadow', 'compact', 'showActorTypeIndicator' ], data () { return { showPlaceholder: false, - defaultAvatar: `${this.$store.state.instance.server + this.$store.state.instance.defaultAvatar}` + defaultAvatar: `${this.$store.state.instance.server + this.$store.state.instance.defaultAvatar}`, + betterShadow: this.$store.state.interface.browserSupport.cssFilter } }, components: { diff --git a/src/components/user_card/user_card.js b/src/components/user_card/user_card.js @@ -48,7 +48,6 @@ export default { data () { return { followRequestInProgress: false, - betterShadow: this.$store.state.interface.browserSupport.cssFilter, showingConfirmMute: false, muteExpiryAmount: 0, muteExpiryUnit: 'minutes' diff --git a/src/components/user_card/user_card.vue b/src/components/user_card/user_card.vue @@ -16,10 +16,7 @@ class="user-info-avatar -link" @click="zoomAvatar" > - <UserAvatar - :better-shadow="betterShadow" - :user="user" - /> + <UserAvatar :user="user" /> <div class="user-info-avatar -link -overlay"> <FAIcon class="fa-scale-110 fa-old-padding" @@ -30,7 +27,6 @@ <UserAvatar v-else-if="typeof avatarAction === 'function'" class="user-info-avatar" - :better-shadow="betterShadow" :user="user" @click="avatarAction" /> @@ -38,10 +34,7 @@ v-else :to="userProfileLink(user)" > - <UserAvatar - :better-shadow="betterShadow" - :user="user" - /> + <UserAvatar :user="user" /> </router-link> <div class="user-summary"> <div class="top-line"> diff --git a/src/i18n/en.json b/src/i18n/en.json @@ -321,7 +321,8 @@ "auto_save_nothing_new": "Nothing new to save.", "auto_save_saved": "Saved.", "auto_save_saving": "Saving...", - "save_to_drafts_button": "Save to drafts" + "save_to_drafts_button": "Save to drafts", + "save_to_drafts_and_close_button": "Save to drafts and close" }, "registration": { "bio_optional": "Bio (optional)", @@ -381,6 +382,7 @@ "actor_type_Person": "a normal user", "actor_type_Service": "a bot", "actor_type_Group": "a group", + "mobile_center_dialog": "Vertically center dialogs on mobile", "app_name": "App name", "expert_mode": "Show advanced", "save": "Save changes", @@ -867,7 +869,8 @@ "lookup_local_fonts": "Load list of fonts installed on this computer", "enter_manually": "Enter font name family manually", "entry": "Enter {fontFamily}", - "select": "Select font" + "select": "Select font", + "label": "{label} font" } }, "interface_font_user_override": "Override theme/browser font used", diff --git a/src/modules/config.js b/src/modules/config.js @@ -142,6 +142,7 @@ export const defaultState = { modalOnApproveFollow: undefined, // instance default modalOnDenyFollow: undefined, // instance default modalOnRemoveUserFromFollowers: undefined, // instance default + modalMobileCenter: undefined, playVideosInModal: false, useOneClickNsfw: false, useContainFit: true, diff --git a/src/modules/instance.js b/src/modules/instance.js @@ -82,6 +82,7 @@ const defaultState = { modalOnApproveFollow: false, modalOnDenyFollow: false, modalOnRemoveUserFromFollowers: false, + modalMobileCenter: false, loginMethod: 'password', logo: '/static/logo.svg', logoMargin: '.2em', diff --git a/src/services/theme_data/theme3_slot_functions.js b/src/services/theme_data/theme3_slot_functions.js @@ -81,9 +81,27 @@ export const colorFunctions = { return alphaBlend(background, amount, foreground) } }, + boost: { + argsNeeded: 2, + documentation: 'If given color is dark makes it darker, if color is light - makes it lighter', + args: [ + 'color: source color', + 'amount: how much darken/brighten the color' + ], + exec: (args, { findColor }, { dynamicVars, staticVars }) => { + const [colorArg, amountArg] = args + + const color = convert(findColor(colorArg, { dynamicVars, staticVars })).rgb + const amount = Number(amountArg) + + const isLight = relativeLuminance(color) < 0.5 + const mod = isLight ? -1 : 1 + return brightness(amount * mod, color).rgb + } + }, mod: { argsNeeded: 2, - documentation: 'Old function that increases or decreases brightness depending if color is dark or light. Advised against using it as it might give unexpected results.', + documentation: 'Old function that increases or decreases brightness depending if background color is dark or light. Advised against using it as it might give unexpected results.', args: [ 'color: source color', 'amount: how much darken/brighten the color' @@ -109,6 +127,7 @@ export const shadowFunctions = { args: [ 'color: border color', 'side: string indicating on which side border should be, takes either one word or two words joined by dash (i.e. "left" or "bottom-right")', + 'width: border width (thickness)', '[alpha]: (Optional) border opacity, defaults to 1 (fully opaque)', '[inset]: (Optional) whether border should be on the inside or outside, defaults to inside' ], diff --git a/static/styles/Redmond DX.iss b/static/styles/Redmond DX.iss @@ -94,7 +94,7 @@ Button:toggled:pressed { } Input { - background: $mod(--bg -80); + background: $boost(--bg 20); shadow: --defaultInputBevel; roundness: 0 }