diff --git a/frontend/src/lang/en.js b/frontend/src/lang/en.js index 6d84590..f59ce85 100644 --- a/frontend/src/lang/en.js +++ b/frontend/src/lang/en.js @@ -132,6 +132,7 @@ export default { messages: 'Messages', color: 'Color', onNewLine: 'On new line', + messageReverseScroll: 'Reverse scrolling', time: 'Timestamps', showTime: 'Show timestamps', diff --git a/frontend/src/lang/ja.js b/frontend/src/lang/ja.js index 7271cba..6d96d20 100644 --- a/frontend/src/lang/ja.js +++ b/frontend/src/lang/ja.js @@ -132,6 +132,7 @@ export default { messages: 'コメント', color: '色', onNewLine: '新しい行に表示する', + messageReverseScroll: '逆方向にスクロールする', time: '時間', showTime: '時間を表示する', diff --git a/frontend/src/lang/zh.js b/frontend/src/lang/zh.js index 88ab5c2..e92e70e 100644 --- a/frontend/src/lang/zh.js +++ b/frontend/src/lang/zh.js @@ -130,6 +130,7 @@ export default { messages: '消息', color: '颜色', onNewLine: '在新行显示', + messageReverseScroll: '反向滚动', time: '时间', showTime: '显示时间', diff --git a/frontend/src/views/StyleGenerator/Legacy.vue b/frontend/src/views/StyleGenerator/Legacy.vue index 52e25a1..6fb3f52 100644 --- a/frontend/src/views/StyleGenerator/Legacy.vue +++ b/frontend/src/views/StyleGenerator/Legacy.vue @@ -135,9 +135,18 @@ - - - + + + + + + + + + + + + @@ -406,6 +415,7 @@ export const DEFAULT_CONFIG = { messageLineHeight: 0, messageColor: '#ffffff', messageOnNewLine: false, + messageReverseScroll: false, emoticonSize: 18, largeEmoticonSize: 36, @@ -582,7 +592,13 @@ yt-live-chat-text-message-renderer #message .emoji { yt-live-chat-text-message-renderer #message .emoji.blc-large-emoji { height: ${this.form.largeEmoticonSize}px !important; -}` +} + +${!this.form.messageReverseScroll ? '' : `yt-live-chat-item-list-renderer, +yt-live-chat-item-list-renderer #items > * { + rotate: 180deg; + backface-visibility: hidden; +}`}` }, timeStyle() { return common.getTimeStyle(this.form) diff --git a/frontend/src/views/StyleGenerator/LineLike.vue b/frontend/src/views/StyleGenerator/LineLike.vue index c821db1..6676c1c 100644 --- a/frontend/src/views/StyleGenerator/LineLike.vue +++ b/frontend/src/views/StyleGenerator/LineLike.vue @@ -121,6 +121,13 @@ + + + + + + + @@ -355,6 +362,7 @@ export const DEFAULT_CONFIG = { messageColor: '#000000', emoticonSize: 18, largeEmoticonSize: 36, + messageReverseScroll: false, showTime: false, timeFont: 'Noto Sans SC', @@ -524,7 +532,13 @@ yt-live-chat-text-message-renderer #message::before { yt-live-chat-text-message-renderer #message:has(.emoji.blc-large-emoji)::before { ${this.form.showLargeEmoticonBg ? '' : 'content: none;'} -}` +} + +${!this.form.messageReverseScroll ? '' : `yt-live-chat-item-list-renderer, +yt-live-chat-item-list-renderer #items > * { + rotate: 180deg; + backface-visibility: hidden; +}`}` }, timeStyle() { return common.getTimeStyle(this.form) diff --git a/frontend/src/views/StyleGenerator/common.js b/frontend/src/views/StyleGenerator/common.js index 4ef6e1d..1fe42b4 100644 --- a/frontend/src/views/StyleGenerator/common.js +++ b/frontend/src/views/StyleGenerator/common.js @@ -118,17 +118,17 @@ export function getAnimationStyle(config) { let curTime = 0 if (config.animateIn) { keyframes.push(` 0% { opacity: 0;${!config.slide ? '' - : ` transform: translateX(${config.reverseSlide ? 16 : -16}px);` + : ` translate: ${config.reverseSlide ? 16 : -16}px;` } }`) curTime += config.fadeInTime - keyframes.push(` ${curTime / totalTime * 100}% { opacity: 1; transform: none; }`) + keyframes.push(` ${curTime / totalTime * 100}% { opacity: 1; translate: none; }`) } if (config.animateOut) { curTime += config.animateOutWaitTime * 1000 - keyframes.push(` ${curTime / totalTime * 100}% { opacity: 1; transform: none; }`) + keyframes.push(` ${curTime / totalTime * 100}% { opacity: 1; translate: none; }`) curTime += config.fadeOutTime keyframes.push(` ${curTime / totalTime * 100}% { opacity: 0;${!config.slide ? '' - : ` transform: translateX(${config.reverseSlide ? -16 : 16}px);` + : ` translate: ${config.reverseSlide ? -16 : 16}px;` } }`) } return `/* Animation */ @@ -136,9 +136,7 @@ export function getAnimationStyle(config) { ${keyframes.join('\n')} } -yt-live-chat-text-message-renderer, -yt-live-chat-membership-item-renderer, -yt-live-chat-paid-message-renderer { +yt-live-chat-item-list-renderer #items > * { animation: anim ${totalTime}ms; animation-fill-mode: both; }`