diff options
| author | syuilo <syuilotan@yahoo.co.jp> | 2020-11-07 23:41:21 +0900 |
|---|---|---|
| committer | syuilo <syuilotan@yahoo.co.jp> | 2020-11-07 23:41:21 +0900 |
| commit | 31aa00856647433c3d4d2f2eb5840d2322e9ffa0 (patch) | |
| tree | 8db6409403a83af5ca4eac9417e449e3daebc549 /src/client/components | |
| parent | 絵文字ピッカーでエンターしたときに検索結果の先頭の... (diff) | |
| download | sharkey-31aa00856647433c3d4d2f2eb5840d2322e9ffa0.tar.gz sharkey-31aa00856647433c3d4d2f2eb5840d2322e9ffa0.tar.bz2 sharkey-31aa00856647433c3d4d2f2eb5840d2322e9ffa0.zip | |
Improve MFM
MFMの構文を調整 + 新しいアニメーション追加
Resolve #6816
Diffstat (limited to 'src/client/components')
| -rw-r--r-- | src/client/components/mfm.ts | 102 | ||||
| -rw-r--r-- | src/client/components/misskey-flavored-markdown.vue | 114 |
2 files changed, 160 insertions, 56 deletions
diff --git a/src/client/components/mfm.ts b/src/client/components/mfm.ts index e1216614a6..aa9ff0952d 100644 --- a/src/client/components/mfm.ts +++ b/src/client/components/mfm.ts @@ -77,9 +77,57 @@ export default defineComponent({ }, genEl(token.children)); } - case 'big': { - return h('strong', { - style: `display: inline-block; font-size: 150%;` + (this.$store.state.device.animatedMfm ? 'animation: anime-tada 1s linear infinite both;' : ''), + case 'fn': { + // TODO: CSSを文字列で組み立てていくと token.node.props.args.~~~ 経由でCSSインジェクションできるのでよしなにやる + let style; + switch (token.node.props.name) { + case 'tada': { + style = `font-size: 150%;` + (this.$store.state.device.animatedMfm ? 'animation: tada 1s linear infinite both;' : ''); + break; + } + case 'jelly': { + const speed = token.node.props.args.speed || '1s'; + style = (this.$store.state.device.animatedMfm ? `animation: mfm-rubberBand ${speed} linear infinite both;` : ''); + break; + } + case 'twitch': { + const speed = token.node.props.args.speed || '0.5s'; + style = this.$store.state.device.animatedMfm ? `animation: mfm-twitch ${speed} ease infinite;` : ''; + break; + } + case 'shake': { + const speed = token.node.props.args.speed || '0.5s'; + style = this.$store.state.device.animatedMfm ? `animation: mfm-shake ${speed} ease infinite;` : ''; + break; + } + case 'spin': { + const direction = + token.node.props.args.left ? 'reverse' : + token.node.props.args.alternate ? 'alternate' : + 'normal'; + const anime = + token.node.props.args.x ? 'mfm-spinX' : + token.node.props.args.y ? 'mfm-spinY' : + 'mfm-spin'; + const speed = token.node.props.args.speed || '1.5s'; + style = this.$store.state.device.animatedMfm ? `animation: ${anime} ${speed} linear infinite; animation-direction: ${direction};` : ''; + break; + } + case 'jump': { + style = this.$store.state.device.animatedMfm ? 'animation: mfm-jump 0.75s linear infinite;' : ''; + break; + } + case 'flip': { + const transform = + (token.node.props.args.h && token.node.props.args.v) ? 'scale(-1, -1)' : + token.node.props.args.v ? 'scaleY(-1)' : + 'scaleX(-1)'; + style = `transform: ${transform};`; + break; + } + } + return h('span', { + style: 'display: inline-block;' + style, }, genEl(token.children)); } @@ -95,48 +143,6 @@ export default defineComponent({ }, genEl(token.children))]; } - case 'motion': { - return h('span', { - style: 'display: inline-block;' + (this.$store.state.device.animatedMfm ? 'animation: anime-rubberBand 1s linear infinite both;' : ''), - }, genEl(token.children)); - } - - case 'spin': { - const direction = - token.node.props.attr == 'left' ? 'reverse' : - token.node.props.attr == 'alternate' ? 'alternate' : - 'normal'; - const style = this.$store.state.device.animatedMfm - ? `animation: anime-spin 1.5s linear infinite; animation-direction: ${direction};` : ''; - return h('span', { - style: 'display: inline-block;' + style - }, genEl(token.children)); - } - - case 'jump': { - return h('span', { - style: this.$store.state.device.animatedMfm ? 'display: inline-block; animation: anime-jump 0.75s linear infinite;' : 'display: inline-block;' - }, genEl(token.children)); - } - - case 'flip': { - return h('span', { - style: 'display: inline-block; transform: scaleX(-1);' - }, genEl(token.children)); - } - - case 'twitch': { - return h('span', { - style: this.$store.state.device.animatedMfm ? 'display: inline-block; animation: anime-twitch 0.5s ease infinite;' : 'display: inline-block;' - }, genEl(token.children)); - } - - case 'shake': { - return h('span', { - style: this.$store.state.device.animatedMfm ? 'display: inline-block; animation: anime-shake 0.5s ease infinite;' : 'display: inline-block;' - }, genEl(token.children)); - } - case 'url': { return [h(MkUrl, { key: Math.random(), @@ -198,12 +204,6 @@ export default defineComponent({ } } - case 'title': { - return [h('div', { - class: 'title' - }, genEl(token.children))]; - } - case 'emoji': { return [h(MkEmoji, { key: Math.random(), diff --git a/src/client/components/misskey-flavored-markdown.vue b/src/client/components/misskey-flavored-markdown.vue index a7ef718f60..c922eb1678 100644 --- a/src/client/components/misskey-flavored-markdown.vue +++ b/src/client/components/misskey-flavored-markdown.vue @@ -13,6 +13,115 @@ export default defineComponent({ }); </script> +<style lang="scss"> +@keyframes mfm-spin { + 0% { transform: rotate(0deg); } + 100% { transform: rotate(360deg); } +} + +@keyframes mfm-spinX { + 0% { transform: perspective(128px) rotateX(0deg); } + 100% { transform: perspective(128px) rotateX(360deg); } +} + +@keyframes mfm-spinY { + 0% { transform: perspective(128px) rotateY(0deg); } + 100% { transform: perspective(128px) rotateY(360deg); } +} + +@keyframes mfm-jump { + 0% { transform: translateY(0); } + 25% { transform: translateY(-16px); } + 50% { transform: translateY(0); } + 75% { transform: translateY(-8px); } + 100% { transform: translateY(0); } +} + +// const val = () => `translate(${Math.floor(Math.random() * 20) - 10}px, ${Math.floor(Math.random() * 20) - 10}px)`; +// let css = ''; +// for (let i = 0; i <= 100; i += 5) { css += `${i}% { transform: ${val()} }\n`; } +@keyframes mfm-twitch { + 0% { transform: translate(7px, -2px) } + 5% { transform: translate(-3px, 1px) } + 10% { transform: translate(-7px, -1px) } + 15% { transform: translate(0px, -1px) } + 20% { transform: translate(-8px, 6px) } + 25% { transform: translate(-4px, -3px) } + 30% { transform: translate(-4px, -6px) } + 35% { transform: translate(-8px, -8px) } + 40% { transform: translate(4px, 6px) } + 45% { transform: translate(-3px, 1px) } + 50% { transform: translate(2px, -10px) } + 55% { transform: translate(-7px, 0px) } + 60% { transform: translate(-2px, 4px) } + 65% { transform: translate(3px, -8px) } + 70% { transform: translate(6px, 7px) } + 75% { transform: translate(-7px, -2px) } + 80% { transform: translate(-7px, -8px) } + 85% { transform: translate(9px, 3px) } + 90% { transform: translate(-3px, -2px) } + 95% { transform: translate(-10px, 2px) } + 100% { transform: translate(-2px, -6px) } +} + +// const val = () => `translate(${Math.floor(Math.random() * 6) - 3}px, ${Math.floor(Math.random() * 6) - 3}px) rotate(${Math.floor(Math.random() * 24) - 12}deg)`; +// let css = ''; +// for (let i = 0; i <= 100; i += 5) { css += `${i}% { transform: ${val()} }\n`; } +@keyframes mfm-shake { + 0% { transform: translate(-3px, -1px) rotate(-8deg) } + 5% { transform: translate(0px, -1px) rotate(-10deg) } + 10% { transform: translate(1px, -3px) rotate(0deg) } + 15% { transform: translate(1px, 1px) rotate(11deg) } + 20% { transform: translate(-2px, 1px) rotate(1deg) } + 25% { transform: translate(-1px, -2px) rotate(-2deg) } + 30% { transform: translate(-1px, 2px) rotate(-3deg) } + 35% { transform: translate(2px, 1px) rotate(6deg) } + 40% { transform: translate(-2px, -3px) rotate(-9deg) } + 45% { transform: translate(0px, -1px) rotate(-12deg) } + 50% { transform: translate(1px, 2px) rotate(10deg) } + 55% { transform: translate(0px, -3px) rotate(8deg) } + 60% { transform: translate(1px, -1px) rotate(8deg) } + 65% { transform: translate(0px, -1px) rotate(-7deg) } + 70% { transform: translate(-1px, -3px) rotate(6deg) } + 75% { transform: translate(0px, -2px) rotate(4deg) } + 80% { transform: translate(-2px, -1px) rotate(3deg) } + 85% { transform: translate(1px, -3px) rotate(-10deg) } + 90% { transform: translate(1px, 0px) rotate(3deg) } + 95% { transform: translate(-2px, 0px) rotate(-3deg) } + 100% { transform: translate(2px, 1px) rotate(2deg) } +} + +@keyframes mfm-rubberBand { + from { + transform: scale3d(1, 1, 1); + } + + 30% { + transform: scale3d(1.25, 0.75, 1); + } + + 40% { + transform: scale3d(0.75, 1.25, 1); + } + + 50% { + transform: scale3d(1.15, 0.85, 1); + } + + 65% { + transform: scale3d(0.95, 1.05, 1); + } + + 75% { + transform: scale3d(1.05, 0.95, 1); + } + + to { + transform: scale3d(1, 1, 1); + } +} +</style> + <style lang="scss" scoped> .havbbuyv { white-space: pre-wrap; @@ -42,10 +151,5 @@ export default defineComponent({ word-break: break-all; padding: 4px 6px; } - - ::v-deep(.title) { - text-align: center; - border-bottom: solid 1px var(--divider); - } } </style> |