Files
plspace/src/styles/mfm.css
T
2026-07-29 15:13:45 +09:00

370 lines
5.3 KiB
CSS

/*
* MFM presentation ported from Pleroma-FE RichContent at
* 38317bee99fbc9d680334eae5dcc33a37bb9777f.
*/
.rich-text {
--emoji-size: var(--ms-emoji-size);
}
.rich-text .mfm {
display: inline-block;
}
.rich-text .mfm.-scale {
font-size: calc(var(--emoji-size) / 2);
}
.rich-text .mfm:not(.-scale) {
--emoji-size: 2em;
}
.rich-text .mfm.-pause {
animation-play-state: paused;
}
.rich-text .mfm[data-mfm-operator='x2'] {
font-size: 300%;
}
.rich-text .mfm[data-mfm-operator='x3'] {
font-size: 400%;
}
.rich-text .mfm[data-mfm-operator='x4'] {
font-size: 600%;
}
.rich-text .mfm[data-mfm-operator='sparkle'] {
position: relative;
}
.rich-text .mfm[data-mfm-operator='sparkle']::before,
.rich-text .mfm[data-mfm-operator='sparkle']::after {
content: '✨';
position: absolute;
opacity: 0.4;
z-index: -1;
animation-name: cheap-sparkle;
animation-duration: 1s;
animation-timing-function: ease-in-out;
animation-iteration-count: infinite;
}
.rich-text .mfm[data-mfm-operator='sparkle']::before {
left: 0;
animation-direction: alternate;
}
.rich-text .mfm[data-mfm-operator='sparkle']::after {
right: 0;
animation-direction: alternate-reverse;
}
.rich-text .mfm .custom-emoji {
/* Misskey's emoji width knows no bounds. */
max-width: unset !important;
}
.rich-text:hover .mfm {
animation-play-state: running;
}
@keyframes mfm-spin {
0% {
transform: rotate(0deg);
}
100% {
transform: rotate(360deg);
}
}
@keyframes mfm-spinX {
0% {
transform: perspective(8em) rotateX(0);
}
100% {
transform: perspective(8em) rotateX(360deg);
}
}
@keyframes mfm-spinY {
0% {
transform: perspective(8em) rotateY(0);
}
100% {
transform: perspective(8em) rotateY(360deg);
}
}
@keyframes mfm-jump {
0% {
transform: translateY(0);
}
25% {
transform: translateY(-1em);
}
50% {
transform: translateY(0);
}
75% {
transform: translateY(-0.5em);
}
100% {
transform: translateY(0);
}
}
@keyframes mfm-bounce {
0% {
transform: translateY(0) scale(1);
}
25% {
transform: translateY(-16px) scale(1);
}
50% {
transform: translateY(0) scale(1);
}
75% {
transform: translateY(0) scale(1.5, 0.75);
}
100% {
transform: translateY(0) scale(1);
}
}
@keyframes mfm-twitch {
0% {
transform: translate(7px, -2px);
}
5% {
transform: translate(-3px, 1px);
}
10% {
transform: translate(-7px, -1px);
}
15% {
transform: translateY(-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);
}
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);
}
}
@keyframes mfm-shake {
0% {
transform: translate(-3px, -1px) rotate(-8deg);
}
5% {
transform: translateY(-1px) rotate(-10deg);
}
10% {
transform: translate(1px, -3px) rotate(0);
}
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: translateY(-1px) rotate(-12deg);
}
50% {
transform: translate(1px, 2px) rotate(10deg);
}
55% {
transform: translateY(-3px) rotate(8deg);
}
60% {
transform: translate(1px, -1px) rotate(8deg);
}
65% {
transform: translateY(-1px) rotate(-7deg);
}
70% {
transform: translate(-1px, -3px) rotate(6deg);
}
75% {
transform: translateY(-2px) rotate(4deg);
}
80% {
transform: translate(-2px, -1px) rotate(3deg);
}
85% {
transform: translate(1px, -3px) rotate(-10deg);
}
90% {
transform: translate(1px) rotate(3deg);
}
95% {
transform: translate(-2px) rotate(-3deg);
}
100% {
transform: translate(2px, 1px) rotate(2deg);
}
}
@keyframes mfm-rubberBand {
0% {
transform: scale(1);
}
30% {
transform: scale(1.25, 0.75);
}
40% {
transform: scale(0.75, 1.25);
}
50% {
transform: scale(1.15, 0.85);
}
65% {
transform: scale(0.95, 1.05);
}
75% {
transform: scale(1.05, 0.95);
}
100% {
transform: scale(1);
}
}
@keyframes mfm-rainbow {
0% {
filter: hue-rotate() contrast(150%) saturate(150%);
}
100% {
filter: hue-rotate(360deg) contrast(150%) saturate(150%);
}
}
@keyframes cheap-sparkle {
0% {
filter: hue-rotate() contrast(150%) saturate(150%);
transform: translateY(-0.5em);
}
100% {
filter: hue-rotate(360deg) contrast(150%) saturate(150%);
transform: translateY(0.5em);
}
}