pause & scale MFM options
This commit is contained in:
parent
5ca430a1c0
commit
4177981eb2
21 changed files with 130 additions and 8 deletions
|
|
@ -36,6 +36,12 @@ const BasicUserCard = {
|
||||||
allowNonSquareEmoji() {
|
allowNonSquareEmoji() {
|
||||||
return useMergedConfigStore().mergedConfig.nonSquareEmoji
|
return useMergedConfigStore().mergedConfig.nonSquareEmoji
|
||||||
},
|
},
|
||||||
|
pauseMfm() {
|
||||||
|
return useMergedConfigStore().mergedConfig.pauseMfm
|
||||||
|
},
|
||||||
|
scaleMfm() {
|
||||||
|
return useMergedConfigStore().mergedConfig.scaleMfm
|
||||||
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -32,6 +32,8 @@
|
||||||
:html="user.name"
|
:html="user.name"
|
||||||
:emoji="user.emoji"
|
:emoji="user.emoji"
|
||||||
:allow-non-square-emoji="allowNonSquareEmoji"
|
:allow-non-square-emoji="allowNonSquareEmoji"
|
||||||
|
:pause-mfm="pauseMfm"
|
||||||
|
:scale-mfm="scaleMfm"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
|
|
|
||||||
|
|
@ -21,5 +21,11 @@ export default {
|
||||||
allowNonSquareEmoji() {
|
allowNonSquareEmoji() {
|
||||||
return useMergedConfigStore().mergedConfig.nonSquareEmoji
|
return useMergedConfigStore().mergedConfig.nonSquareEmoji
|
||||||
},
|
},
|
||||||
|
pauseMfm() {
|
||||||
|
return useMergedConfigStore().mergedConfig.pauseMfm
|
||||||
|
},
|
||||||
|
scaleMfm() {
|
||||||
|
return useMergedConfigStore().mergedConfig.scaleMfm
|
||||||
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -20,6 +20,8 @@
|
||||||
:html="htmlTitle"
|
:html="htmlTitle"
|
||||||
:emoji="user.emoji || []"
|
:emoji="user.emoji || []"
|
||||||
:allow-non-square-emoji="allowNonSquareEmoji"
|
:allow-non-square-emoji="allowNonSquareEmoji"
|
||||||
|
:pause-mfm="pauseMfm"
|
||||||
|
:scale-mfm="scaleMfm"
|
||||||
:is-local="user.is_local"
|
:is-local="user.is_local"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
|
|
@ -217,6 +217,12 @@ const Notification = {
|
||||||
allowNonSquareEmoji() {
|
allowNonSquareEmoji() {
|
||||||
return this.mergedConfig.nonSquareEmoji
|
return this.mergedConfig.nonSquareEmoji
|
||||||
},
|
},
|
||||||
|
pauseMfm() {
|
||||||
|
return this.mergedConfig.pauseMfm
|
||||||
|
},
|
||||||
|
scaleMfm() {
|
||||||
|
return this.mergedConfig.scaleMfm
|
||||||
|
},
|
||||||
shouldConfirmApprove() {
|
shouldConfirmApprove() {
|
||||||
return this.mergedConfig.modalOnApproveFollow
|
return this.mergedConfig.modalOnApproveFollow
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -72,6 +72,8 @@
|
||||||
:html="notification.from_profile.name_html"
|
:html="notification.from_profile.name_html"
|
||||||
:emoji="notification.from_profile.emoji"
|
:emoji="notification.from_profile.emoji"
|
||||||
:allow-non-square-emoji="allowNonSquareEmoji"
|
:allow-non-square-emoji="allowNonSquareEmoji"
|
||||||
|
:pause-mfm="pauseMfm"
|
||||||
|
:scale-mfm="scaleMfm"
|
||||||
:is-local="notification.from_profile.is_local"
|
:is-local="notification.from_profile.is_local"
|
||||||
/>
|
/>
|
||||||
</bdi>
|
</bdi>
|
||||||
|
|
|
||||||
|
|
@ -57,6 +57,12 @@ export default {
|
||||||
allowNonSquareEmoji() {
|
allowNonSquareEmoji() {
|
||||||
return useMergedConfigStore().mergedConfig.nonSquareEmoji
|
return useMergedConfigStore().mergedConfig.nonSquareEmoji
|
||||||
},
|
},
|
||||||
|
pauseMfm() {
|
||||||
|
return useMergedConfigStore().mergedConfig.pauseMfm
|
||||||
|
},
|
||||||
|
scaleMfm() {
|
||||||
|
return useMergedConfigStore().mergedConfig.scaleMfm
|
||||||
|
},
|
||||||
loggedIn() {
|
loggedIn() {
|
||||||
return this.$store.state.users.currentUser
|
return this.$store.state.users.currentUser
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -25,6 +25,8 @@
|
||||||
:handle-links="false"
|
:handle-links="false"
|
||||||
:emoji="emoji"
|
:emoji="emoji"
|
||||||
:allow-non-square-emoji="allowNonSquareEmoji"
|
:allow-non-square-emoji="allowNonSquareEmoji"
|
||||||
|
:pause-mfm="pauseMfm"
|
||||||
|
:scale-mfm="scaleMfm"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div
|
<div
|
||||||
|
|
|
||||||
|
|
@ -118,6 +118,16 @@ export default {
|
||||||
type: Boolean,
|
type: Boolean,
|
||||||
default: false,
|
default: false,
|
||||||
},
|
},
|
||||||
|
pauseMfm: {
|
||||||
|
required: false,
|
||||||
|
type: Boolean,
|
||||||
|
default: false,
|
||||||
|
},
|
||||||
|
scaleMfm: {
|
||||||
|
required: false,
|
||||||
|
type: Boolean,
|
||||||
|
default: false,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
// NEVER EVER TOUCH DATA INSIDE RENDER
|
// NEVER EVER TOUCH DATA INSIDE RENDER
|
||||||
render() {
|
render() {
|
||||||
|
|
@ -320,12 +330,16 @@ export default {
|
||||||
const isMFM = classname?.startsWith('mfm-')
|
const isMFM = classname?.startsWith('mfm-')
|
||||||
if (isMFM) {
|
if (isMFM) {
|
||||||
const mfmOperator = /^mfm-(\w+)$/.exec(classname)?.[1]
|
const mfmOperator = /^mfm-(\w+)$/.exec(classname)?.[1]
|
||||||
newAttrs['class'] = 'mfm'
|
newAttrs['class'] = [
|
||||||
|
'mfm',
|
||||||
|
this.pauseMfm ? '-pause' : '',
|
||||||
|
this.scaleMfm ? '-scale' : '',
|
||||||
|
].filter(x => x).join(' ')
|
||||||
newAttrs['data-mfm-operator'] = mfmOperator
|
newAttrs['data-mfm-operator'] = mfmOperator
|
||||||
switch(mfmOperator) {
|
switch(mfmOperator) {
|
||||||
case 'position': {
|
case 'position': {
|
||||||
const x = fullAttrs['data-mfm-x'].replace(/\.+$/,'') || 0
|
const x = Number.parseFloat(fullAttrs['data-mfm-x']) || 0
|
||||||
const y = fullAttrs['data-mfm-y'].replace(/\.+$/,'') || 0
|
const y = Number.parseFloat(fullAttrs['data-mfm-y']) || 0
|
||||||
newAttrs.style = [
|
newAttrs.style = [
|
||||||
'transform:',
|
'transform:',
|
||||||
`translate(calc(${x} * (var(--emoji-size) / 2)), `,
|
`translate(calc(${x} * (var(--emoji-size) / 2)), `,
|
||||||
|
|
@ -334,8 +348,8 @@ export default {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
case 'scale': {
|
case 'scale': {
|
||||||
const x = fullAttrs['data-mfm-x'].replace(/\.+$/,'') || 1
|
const x = Number.parseFloat(fullAttrs['data-mfm-x']) || 1
|
||||||
const y = fullAttrs['data-mfm-y'].replace(/\.+$/,'') || 1
|
const y = Number.parseFloat(fullAttrs['data-mfm-y']) || 1
|
||||||
newAttrs.style = [
|
newAttrs.style = [
|
||||||
'transform:',
|
'transform:',
|
||||||
`scale(${x}, ${y})`,
|
`scale(${x}, ${y})`,
|
||||||
|
|
@ -343,7 +357,7 @@ export default {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
case 'rotate': {
|
case 'rotate': {
|
||||||
const deg = fullAttrs['data-mfm-deg'] || 0
|
const deg = Number.parseFloat(fullAttrs['data-mfm-deg']) || 0
|
||||||
newAttrs.style = [
|
newAttrs.style = [
|
||||||
`transform: rotate(${deg}deg)`,
|
`transform: rotate(${deg}deg)`,
|
||||||
'transform-origin: center',
|
'transform-origin: center',
|
||||||
|
|
@ -418,7 +432,8 @@ export default {
|
||||||
case 'twitch':
|
case 'twitch':
|
||||||
case 'shake':
|
case 'shake':
|
||||||
case 'jump':
|
case 'jump':
|
||||||
case 'bounce': {
|
case 'bounce':
|
||||||
|
case 'rainbow': {
|
||||||
const speed = fullAttrs['data-mfm-speed'] || '1s'
|
const speed = fullAttrs['data-mfm-speed'] || '1s'
|
||||||
const delay = fullAttrs['data-mfm-delay'] || 0
|
const delay = fullAttrs['data-mfm-delay'] || 0
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,18 @@
|
||||||
|
|
||||||
.mfm {
|
.mfm {
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
font-size: calc(var(--emoji-size) / 2);
|
|
||||||
|
&.-scale {
|
||||||
|
font-size: calc(var(--emoji-size) / 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
&:not(.-scale) {
|
||||||
|
--emoji-size: 2em;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.-pause {
|
||||||
|
animation-play-state: paused;
|
||||||
|
}
|
||||||
|
|
||||||
.emoji {
|
.emoji {
|
||||||
/* Misskey's emoji width knows no bounds */
|
/* Misskey's emoji width knows no bounds */
|
||||||
|
|
@ -12,6 +23,10 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
&:hover .mfm {
|
||||||
|
animation-play-state: running;
|
||||||
|
}
|
||||||
|
|
||||||
&.-faint {
|
&.-faint {
|
||||||
color: var(--text);
|
color: var(--text);
|
||||||
/* stylelint-disable declaration-no-important */
|
/* stylelint-disable declaration-no-important */
|
||||||
|
|
|
||||||
|
|
@ -174,6 +174,16 @@
|
||||||
{{ $t('settings.non_square_emoji') }}
|
{{ $t('settings.non_square_emoji') }}
|
||||||
</BooleanSetting>
|
</BooleanSetting>
|
||||||
</li>
|
</li>
|
||||||
|
<li>
|
||||||
|
<BooleanSetting path="scaleMfm">
|
||||||
|
{{ $t('settings.scale_mfm') }}
|
||||||
|
</BooleanSetting>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<BooleanSetting path="pauseMfm">
|
||||||
|
{{ $t('settings.pause_mfm') }}
|
||||||
|
</BooleanSetting>
|
||||||
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<BooleanSetting
|
<BooleanSetting
|
||||||
:local="true"
|
:local="true"
|
||||||
|
|
|
||||||
|
|
@ -136,6 +136,12 @@ const Status = {
|
||||||
allowNonSquareEmoji() {
|
allowNonSquareEmoji() {
|
||||||
return this.mergedConfig.nonSquareEmoji
|
return this.mergedConfig.nonSquareEmoji
|
||||||
},
|
},
|
||||||
|
pauseMfm() {
|
||||||
|
return this.mergedConfig.pauseMfm
|
||||||
|
},
|
||||||
|
scaleMfm() {
|
||||||
|
return this.mergedConfig.scaleMfm
|
||||||
|
},
|
||||||
repeaterClass() {
|
repeaterClass() {
|
||||||
const user = this.statusoid.user
|
const user = this.statusoid.user
|
||||||
return highlightClass(user)
|
return highlightClass(user)
|
||||||
|
|
|
||||||
|
|
@ -71,6 +71,8 @@
|
||||||
:html="retweeterHtml"
|
:html="retweeterHtml"
|
||||||
:emoji="retweeterUser.emoji"
|
:emoji="retweeterUser.emoji"
|
||||||
:allow-non-square-emoji="allowNonSquareEmoji"
|
:allow-non-square-emoji="allowNonSquareEmoji"
|
||||||
|
:pause-mfm="pauseMfm"
|
||||||
|
:scale-mfm="scaleMfm"
|
||||||
:is-local="retweeterUser.is_local"
|
:is-local="retweeterUser.is_local"
|
||||||
/>
|
/>
|
||||||
</router-link>
|
</router-link>
|
||||||
|
|
|
||||||
|
|
@ -59,6 +59,12 @@ const StatusBody = {
|
||||||
allowNonSquareEmoji() {
|
allowNonSquareEmoji() {
|
||||||
return this.mergedConfig.nonSquareEmoji
|
return this.mergedConfig.nonSquareEmoji
|
||||||
},
|
},
|
||||||
|
pauseMfm() {
|
||||||
|
return this.mergedConfig.pauseMfm
|
||||||
|
},
|
||||||
|
scaleMfm() {
|
||||||
|
return this.mergedConfig.scaleMfm
|
||||||
|
},
|
||||||
// This is a bit hacky, but we want to approximate post height before rendering
|
// This is a bit hacky, but we want to approximate post height before rendering
|
||||||
// so we count newlines (masto uses <p> for paragraphs, GS uses <br> between them)
|
// so we count newlines (masto uses <p> for paragraphs, GS uses <br> between them)
|
||||||
// as well as approximate line count by counting characters and approximating ~80
|
// as well as approximate line count by counting characters and approximating ~80
|
||||||
|
|
|
||||||
|
|
@ -16,6 +16,8 @@
|
||||||
:emoji="status.emojis"
|
:emoji="status.emojis"
|
||||||
:is-local="status.isLocal"
|
:is-local="status.isLocal"
|
||||||
:allow-non-square-emoji="allowNonSquareEmoji"
|
:allow-non-square-emoji="allowNonSquareEmoji"
|
||||||
|
:pause-mfm="pauseMfm"
|
||||||
|
:scale-mfm="scaleMfm"
|
||||||
/>
|
/>
|
||||||
<button
|
<button
|
||||||
v-show="hasLongSubject && showingLongSubject"
|
v-show="hasLongSubject && showingLongSubject"
|
||||||
|
|
@ -49,6 +51,8 @@
|
||||||
:attentions="status.attentions"
|
:attentions="status.attentions"
|
||||||
:is-local="status.is_local"
|
:is-local="status.is_local"
|
||||||
:allow-non-square-emoji="allowNonSquareEmoji"
|
:allow-non-square-emoji="allowNonSquareEmoji"
|
||||||
|
:pause-mfm="pauseMfm"
|
||||||
|
:scale-mfm="scaleMfm"
|
||||||
@parse-ready="onParseReady"
|
@parse-ready="onParseReady"
|
||||||
/>
|
/>
|
||||||
<div
|
<div
|
||||||
|
|
|
||||||
|
|
@ -433,6 +433,12 @@ export default {
|
||||||
allowNonSquareEmoji() {
|
allowNonSquareEmoji() {
|
||||||
return this.mergedConfig.nonSquareEmoji
|
return this.mergedConfig.nonSquareEmoji
|
||||||
},
|
},
|
||||||
|
pauseMfm() {
|
||||||
|
return this.mergedConfig.pauseMfm
|
||||||
|
},
|
||||||
|
scaleMfm() {
|
||||||
|
return this.mergedConfig.scaleMfm
|
||||||
|
},
|
||||||
hideUserStats() {
|
hideUserStats() {
|
||||||
return this.mergedConfig.hideUserStats
|
return this.mergedConfig.hideUserStats
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -141,6 +141,8 @@
|
||||||
:html="editable ? newName : user.name_unescaped"
|
:html="editable ? newName : user.name_unescaped"
|
||||||
:emoji="editable ? emoji : user.emoji"
|
:emoji="editable ? emoji : user.emoji"
|
||||||
:allow-non-square-emoji="allowNonSquareEmoji"
|
:allow-non-square-emoji="allowNonSquareEmoji"
|
||||||
|
:pause-mfm="pauseMfm"
|
||||||
|
:scale-mfm="scaleMfm"
|
||||||
/>
|
/>
|
||||||
</router-link>
|
</router-link>
|
||||||
<EmojiInput
|
<EmojiInput
|
||||||
|
|
@ -487,6 +489,8 @@
|
||||||
:html="editable ? escapedNewBio : user.description_html"
|
:html="editable ? escapedNewBio : user.description_html"
|
||||||
:emoji="editable ? emoji : user.emoji"
|
:emoji="editable ? emoji : user.emoji"
|
||||||
:allow-non-square-emoji="allowNonSquareEmoji"
|
:allow-non-square-emoji="allowNonSquareEmoji"
|
||||||
|
:pause-mfm="pauseMfm"
|
||||||
|
:scale-mfm="scaleMfm"
|
||||||
:handle-links="true"
|
:handle-links="true"
|
||||||
/>
|
/>
|
||||||
</template>
|
</template>
|
||||||
|
|
@ -542,6 +546,8 @@
|
||||||
:html="field.name"
|
:html="field.name"
|
||||||
:emoji="editable ? emoji : user.emoji"
|
:emoji="editable ? emoji : user.emoji"
|
||||||
:allow-non-square-emoji="allowNonSquareEmoji"
|
:allow-non-square-emoji="allowNonSquareEmoji"
|
||||||
|
:pause-mfm="pauseMfm"
|
||||||
|
:scale-mfm="scaleMfm"
|
||||||
/>
|
/>
|
||||||
</dt>
|
</dt>
|
||||||
<dd
|
<dd
|
||||||
|
|
@ -552,6 +558,8 @@
|
||||||
:html="field.value"
|
:html="field.value"
|
||||||
:emoji="editable ? emoji : user.emoji"
|
:emoji="editable ? emoji : user.emoji"
|
||||||
:allow-non-square-emoji="allowNonSquareEmoji"
|
:allow-non-square-emoji="allowNonSquareEmoji"
|
||||||
|
:pause-mfm="pauseMfm"
|
||||||
|
:scale-mfm="scaleMfm"
|
||||||
/>
|
/>
|
||||||
</dd>
|
</dd>
|
||||||
</dl>
|
</dl>
|
||||||
|
|
|
||||||
|
|
@ -27,6 +27,12 @@ const UserListPopover = {
|
||||||
allowNonSquareEmoji() {
|
allowNonSquareEmoji() {
|
||||||
return useMergedConfigStore().mergedConfig.nonSquareEmoji
|
return useMergedConfigStore().mergedConfig.nonSquareEmoji
|
||||||
},
|
},
|
||||||
|
pauseMfm() {
|
||||||
|
return useMergedConfigStore().mergedConfig.pauseMfm
|
||||||
|
},
|
||||||
|
scaleMfm() {
|
||||||
|
return useMergedConfigStore().mergedConfig.scaleMfm
|
||||||
|
},
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
generateProfileLink(user) {
|
generateProfileLink(user) {
|
||||||
|
|
|
||||||
|
|
@ -29,6 +29,8 @@
|
||||||
:html="user.name_html"
|
:html="user.name_html"
|
||||||
:emoji="user.emoji"
|
:emoji="user.emoji"
|
||||||
:allow-non-square-emoji="allowNonSquareEmoji"
|
:allow-non-square-emoji="allowNonSquareEmoji"
|
||||||
|
:pause-mfm="pauseMfm"
|
||||||
|
:scale-mfm="scaleMfm"
|
||||||
/>
|
/>
|
||||||
<!-- eslint-enable vue/no-v-html -->
|
<!-- eslint-enable vue/no-v-html -->
|
||||||
<span class="user-list-screen-name">{{ user.screen_name_ui }}</span><UnicodeDomainIndicator :user="user" />
|
<span class="user-list-screen-name">{{ user.screen_name_ui }}</span><UnicodeDomainIndicator :user="user" />
|
||||||
|
|
|
||||||
|
|
@ -807,6 +807,8 @@
|
||||||
"sensitive_by_default": "Mark posts as sensitive by default",
|
"sensitive_by_default": "Mark posts as sensitive by default",
|
||||||
"stop_gifs": "Pause animated images until you hover on them",
|
"stop_gifs": "Pause animated images until you hover on them",
|
||||||
"non_square_emoji": "Allow non-square emoji",
|
"non_square_emoji": "Allow non-square emoji",
|
||||||
|
"pause_mfm": "Pause MFM animations until you hover on them",
|
||||||
|
"scale_mfm": "Scale MFM animations with emoji size",
|
||||||
"streaming": "Automatically show new posts when scrolled to the top",
|
"streaming": "Automatically show new posts when scrolled to the top",
|
||||||
"auto_update": "Show new posts automatically",
|
"auto_update": "Show new posts automatically",
|
||||||
"user_mutes": "Users",
|
"user_mutes": "Users",
|
||||||
|
|
|
||||||
|
|
@ -237,6 +237,14 @@ export const INSTANCE_DEFAULT_CONFIG_DEFINITIONS = {
|
||||||
description: 'Allow emoji to be non-square (max 3:1 aspect)',
|
description: 'Allow emoji to be non-square (max 3:1 aspect)',
|
||||||
default: true,
|
default: true,
|
||||||
},
|
},
|
||||||
|
pauseMfm: {
|
||||||
|
description: 'Pause MFM animations',
|
||||||
|
default: true,
|
||||||
|
},
|
||||||
|
scaleMfm: {
|
||||||
|
description: 'Scale MFM animation with emoji size',
|
||||||
|
default: false,
|
||||||
|
},
|
||||||
replyVisibility: {
|
replyVisibility: {
|
||||||
description: 'Type of replies to show',
|
description: 'Type of replies to show',
|
||||||
default: 'all',
|
default: 'all',
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue