From 31aa00856647433c3d4d2f2eb5840d2322e9ffa0 Mon Sep 17 00:00:00 2001
From: syuilo
Date: Sat, 7 Nov 2020 23:41:21 +0900
Subject: Improve MFM
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
MFMの構文を調整 + 新しいアニメーション追加
Resolve #6816
---
src/client/components/mfm.ts | 102 +++++++++---------
.../components/misskey-flavored-markdown.vue | 114 ++++++++++++++++++++-
src/client/pages/reversi/game.board.vue | 2 +-
src/client/style.scss | 99 +-----------------
4 files changed, 162 insertions(+), 155 deletions(-)
(limited to 'src/client')
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({
});
+
+
diff --git a/src/client/pages/reversi/game.board.vue b/src/client/pages/reversi/game.board.vue
index 96ea86547d..6559396aca 100644
--- a/src/client/pages/reversi/game.board.vue
+++ b/src/client/pages/reversi/game.board.vue
@@ -11,7 +11,7 @@
{{ $t('_reversi.opponentTurn') }}
- {{ $t('_reversi.myTurn') }}
+ {{ $t('_reversi.myTurn') }}
diff --git a/src/client/style.scss b/src/client/style.scss
index 07abbe0814..9715bde10b 100644
--- a/src/client/style.scss
+++ b/src/client/style.scss
@@ -486,74 +486,7 @@ hr {
90% { opacity: 0; transform: scale(0.5); }
}
-@keyframes anime-spin {
- 0% { transform: rotate(0deg); }
- 100% { transform: rotate(360deg); }
-}
-
-@keyframes anime-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 anime-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 anime-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 anime-tada {
+@keyframes tada {
from {
transform: scale3d(1, 1, 1);
}
@@ -580,33 +513,3 @@ hr {
transform: scale3d(1, 1, 1);
}
}
-
-@keyframes anime-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);
- }
-}
--
cgit v1.2.3-freya